首页 > 解决方案 > 在 TypeScript 中键入构造函数

问题描述

我在理解如何在 TS 中正确键入构造函数时遇到问题。我知道一个常见的答案是使用一个类,但我目前正在探索 TS 功能。在我的tsconfig.json我有noImplicitAny: true.

我的构造函数在 JS 中如下所示:

function User(username) {
     this.username = username
}
User.prototype.age = 57

我第一次尝试键入函数依赖于解释如何定义调用签名的TS 文档:

interface IUser {
    username: string;
    age: number;
}

type UserConstructor = {
    (username: string): void;
    new (username: string): IUser;
}

const User: UserConstructor = function(username: string) {
    this.username = username
}
User.prototype.age = 57

编译器抱怨,因为值this未知并且调用签名似乎不匹配。

在做了一些研究之后,我想出了一个可行的版本,但我不太喜欢它:

interface ICUser {
    username: string;
    age: number;
}

function ConstructedUser(this:ICUser, username: string) {
    this.username = username;
}

ConstructedUser.prototype.dateOfBirth = "Freb"

这是我不喜欢解决方案 nr 的地方。2:

我找不到关于如何键入构造函数的好资源,希望有人能提供帮助。

标签: typescript

解决方案


看起来答案是,如果没有类型断言(例如as any),您将无法做到这一点,因为您不应该在 Typescript 中编写构造函数。这个 GitHub 问题建议允许它,并且该建议被标记为“拒绝”并关闭:

如果有的话,我们宁愿删除新的 void 函数的能力。不一致是不幸的,但我们不想添加一个大的类型安全孔,以与我们一开始甚至不喜欢的方面保持一致。

在 Typescript 中编写代码的正确方法是使用class语法来声明一个类。如果需要与旧浏览器兼容,您可以tsc在编译期间强制将类声明转换为构造函数,方法是将目标语言级别设置为 ES3 或 ES5。


推荐阅读