如何实现包含构造函数和方法的 TypeScript 构造签名?

2023-12-13

我已经了解了 TypeScript 中的这样的功能《构建签名》

它允许声明类型,例如:

type PointCreator = {
  new (x: number, y: number): {x: number, y: number},
  test(test:number): number,
  (foo:number): number,
}

我将如何创建这种类型的对象?

当我尝试声明这种类型的对象时:我收到错误"Type 'typeof PointCreation' is not assignable to type 'PointCreator'. Type 'typeof PointCreation' provides no match for the signature '(foo: number): number'.

const PointCreation: PointCreator = class { 
  constructor(public x: number, public y: number) {}
  static test = (test:number) => {return test;};
  bloo = (foo:number) => {return foo;};
}

另外,我不明白为什么功能test()必须是static。 如果我要删除static关键字出现另一个编译错误:Property 'test' is missing in type 'typeof PointCreation' but required in type 'PointCreator'.

当尝试使用构造函数或一堆函数声明类型时,编写相应的对象非常容易。


为什么可以创建这样的类型?

因为javascript。例如Date目的。 TS 允许创建ConstructOrCall类型,因为向后兼容性。

假设您有一些遗留代码:


export const PointCreator = function (x,y) {
  if (new.target) {
    // If this function was called with new keyword
    this.x = x
    this.y = y
  } else {
    // if function was called as a regular function
    return 42
  }

}

// static test method
PointCreator.test = function (a) {

}

const x = new PointCreator(1, 2)

并且您想为其编写打字。那么这个类型就可以了

declare module 'legacy' {
  export type PointCreator = {
    new(x: number, y: number): { x: number, y: number },
    test(test: number): number,
    (foo: number): number,
  }
}

但是,您无法在纯打字稿中创造这样的价值。

另外,我不明白为什么函数 test() 需要是静态的

因为PointCreator是一个构造函数类型并且test直接定义为构造函数属性的方法。为了将其用作实例方法,您应该更新您的类型:

type PointCreator = {
  new(x: number, y: number): { x: number, y: number, test: (arg: number) => number },
}

const PointCreation: PointCreator = class {
  constructor(public x: number, public y: number) { }
  test = (arg: number) => 42 // ok
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现包含构造函数和方法的 TypeScript 构造签名? 的相关文章

随机推荐

  • 将 JSF 与 Spring 集成

    我还没有实现任何代码 我仍在研究新应用程序的整体架构 这将是我第一次使用JSF Spring 我需要将 Web 服务放在 Spring 服务 bean 业务逻辑层 前面 因为这些 bean 可以被表示层之外的其他应用程序访问 在为应用程序定
  • Scala 逆变和协变

    我正在研究 scala 的类型系统 发现了一个奇怪的情况 我有充分的理由相信 我不懂协变和协变 这是我的问题案例 我有两个类 Point 和 ColorPoint 它是 Point 的子类 class Point val x Int val
  • jQuery UI 按钮未“取消单击”

    http jqueryui com demos button default它们使用起来非常简单 但由于某种原因 我的按钮没有 取消点击 也就是说 在我单击按钮后 它保持其悬停样式 如果我将其 onClick 函数设置为仅执行一些简单的操作
  • 有没有办法检索 Dialogflow 中的对话历史记录?

    有没有办法获得用户和代理之间的完整对话 与我通过单击历史标签获得的结果非常相似 但是以编程方式获得 重点是将用户和代理之间的交互保存为文本 提前谢谢各位了 没有 API 可以直接从 Dialogflow 检索历史记录 但您可以做的是启用日志
  • 在python 2.7中同时运行脚本多次

    您好 我正在尝试多次运行脚本 但根据我的理解 希望这同时发生 我将一起使用子进程和线程 但是 当我运行它时 它看起来仍然是按顺序执行的 有人可以帮助我 以便我可以让它一遍又一遍地运行相同的脚本 但同时 它实际上有效但速度很慢吗 编辑忘记了最
  • 在 UIWebView 中显示 .rtf 文件

    我正在尝试显示为我的服务器下载的 rft 文件 我首先使用 UITextView 但我可以看到文本 但也显示了很多编码和与颜色和格式相关的奇怪字符 不管怎样 在这里搜索我发现 UITextView 无法正确显示 rtf 文本 因此 我继续尝
  • 如何在 R 中以美元格式设置条形图标签的格式?

    希望在 x 轴上的标签和条形图中的数字上添加美元符号 下面是我的代码和图表 YTD bar lt ggplot TYSales LYSales aes x as character FSCL YR y SALES geom bar stat
  • 如何在 Nuxt.js 中的内联样式中使用背景图像

    我有一个 vue我想在其中使用内联样式的文件 img src static img info production pic4 jpg class t22 a href page fresco art class btn t23 First
  • Tomcat 上的 Jersey REST 服务出现 404 错误

    我已经查看了有关该主题的所有可用答案 要么我面临一个完全不同的问题 要么我错过了一些重要的事情 服务等级 package org test import javax ws rs GET import javax ws rs Path imp
  • 通过API或网页公开数据库自增id

    我认为不公开自动递增的数据库 ID 帐户 产品等 是更好的方法 我们也许可以使用 UUID 并通过 API 或网页公开它们 但我查了一下 很多大公司似乎并不关心 谷歌 亚马逊 Facebook Twitter 似乎都有数字 自动递增帐户 I
  • htaccess重写不同页面的url

    我在 htaccess 文件中做了这个 用于从不同页面重写 url Options FollowSymLinks RewriteEngine on RewriteCond REQUEST FILENAME f RewriteCond REQ
  • 审计实体 JPA 中的更改

    我有 Spring MVC JPA 应用程序 我的应用程序中有几个实体在不断变化 我希望能够审核此更改 我发现有一个 Audited跟踪某些字段或整个实体的更改的注释 我想知道是否有任何方法可以配置此跟踪选项 我希望能够跟踪更改的内容以及更
  • git commit 出现致命错误“致命:CRLF 将被 LF 替换”

    我正在使用 Ubuntu 13 10 x64 我正在开发一个项目 一些开发人员正在使用 Windows 我最近更改了 git 配置core eol到 lf 和core autocrlf 输入 和core safecrlf到 真实 从那时起
  • dbplyr copy_to 不将表保存到数据库

    我正在尝试将本地数据帧从 R 复制到我的 db2 数据库 我有权写入该表 并且我已验证连接正常工作 我在用 copy to connection data frame name my table name 我收到以下错误 这对我来说没有意义
  • JSON_MODIFY 在 SQL Server 2017 中无法正常工作

    这是我的代码 DECLARE info NVARCHAR MAX searchQuery reportType ReportedHcEcg pageQuery pageNumber 1 pageSize 10 sortColumnName
  • 运行多个Python脚本

    我想创建一个简单的 Python 程序 它将同时执行 2 个独立的脚本 目前 这两个脚本只是打印一系列数字 但我的目的是在将来使用该程序同时运行一些 Twitter 流程 序 我怀疑我需要使用subprocess Popen但我不太清楚我应
  • 使用 google place Api 在 Android 中查找以公里为单位的距离

    我想显示两个地方的距离 以公里为单位 为此我编写了以下代码 hyd 17 38 78 48 eluru 16 7 81 1 private String getDistance double lat1 double lat2 double
  • 具有类型混淆的自定义 Java 迭代器

    我有一个通用类 它捆绑了一个对象和一个订单 public class OrderedObject
  • 创建 AWS QuickSight 模板时出现“Expected 2 placeholders.Given 1”错误

    我已按照 AWS Quicksight 文档中的建议设置了 template json 文件here 我的文件如下所示 AwsAccountId xxxxxxx TemplateId TestTemplate Name Demo Dashb
  • 如何实现包含构造函数和方法的 TypeScript 构造签名?

    我已经了解了 TypeScript 中的这样的功能 构建签名 它允许声明类型 例如 type PointCreator new x number y number x number y number test test number num