typescript - 在 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:
- 我不确定我是否完全理解这个明确的传递,因为没有任何官方文档。
- 输入非常冗长,并且没有将实例和原型链上的属性分开。
我找不到关于如何键入构造函数的好资源,希望有人能提供帮助。
解决方案
看起来答案是,如果没有类型断言(例如as any
),您将无法做到这一点,因为您不应该在 Typescript 中编写构造函数。这个 GitHub 问题建议允许它,并且该建议被标记为“拒绝”并关闭:
如果有的话,我们宁愿删除新的 void 函数的能力。不一致是不幸的,但我们不想添加一个大的类型安全孔,以与我们一开始甚至不喜欢的方面保持一致。
在 Typescript 中编写代码的正确方法是使用class
语法来声明一个类。如果需要与旧浏览器兼容,您可以tsc
在编译期间强制将类声明转换为构造函数,方法是将目标语言级别设置为 ES3 或 ES5。
推荐阅读
- asp.net-mvc - Entity Framework——代码优先,调用复杂的存储过程
- apache-spark - 如何导入火花会话
- authentication - Vaadin LoginForm - signaling when user passed or failed authentication
- c# - 如何让 GridView 从 TextBox 弹出作为 asp.net 中的 Searchfield
- node.js - How to perform exact match for folder name with prefix using ListObjectsV2 AWS S3 node js sdk?
- typescript - How to write type that transform Array of tuples into Union of Tuples
- dart - Constructor with not initialized final class variables
- android - Function not getting called Kotlin
- jquery - Ajax response not fetching all result
- elasticsearch - Elasticsearch 7 unable to create index