typescript - 如何在 typescript 中声明一个类,就像使用“class”关键字一样?
问题描述
打字稿中的类有点奇怪,因为它们似乎既是实际的“事物”(在这种情况下是函数)又是打字稿类型。
例子:
class Test {
public x: string = 'test';
}
function printX(test: Test) {
console.log(test.x);
}
function createTest() {
return new Test();
}
注意我可以说printX
接受类型 Test
的参数,但也用作方法中Test
的值createTest()
。所以同一个符号“ Test
”既是值又是类型。
如何在不使用明显class
关键字的情况下重新创建相同类型的构造?
例如:
function makeTestClass() {
return class Test {
public x: string = 'test';
};
}
const Test = makeTestClass();
function printX(test: Test) {
console.log(test.x);
}
function createTest() {
return new Test();
}
这段代码不会编译,因为打字稿会认为Test
是一个值,而不是一个类型。
那么有什么方法可以告诉我打字稿Test
实际上是你使用class
关键字得到的神奇的双重类型/值吗?
解决方案
我相信最接近您的要求的人可能会得到类似的东西:
interface Test {
x: string
}
const Test = function Test(this: Test){
this.x = 'string' as string
return this
} as unknown as { new (): Test }
function printX(test: Test) {
console.log(test.x);
}
function createTest() {
return new Test();
}
在这里Test
,我们为类实例的值定义接口(类型级别)。以及用于创建我们的实例的构造函数Test
(值级别)。由于函数没有内置构造函数签名,我们必须断言 ( as unknown as { new (): Test }
) typescript 该函数仍然可以用作带有new
关键字的构造函数。
这个功能还缺少很多真正的功能class
。它不支持继承,也不能设置私有(在打字稿意义上)成员或方法。还要记住,接口也不能完全模仿class
实例。因为他们也无法描述private
成员或方法。
推荐阅读
- pandas - Pandas 数据框长度与 wc 行数不一致
- django - 使用登录时生成的令牌
- python - 从python中的范围号映射值的最佳方法?
- mysql - MySQL 显示 2 个表的计数而不分组
- python - 尝试访问 S3 文件时出现 Amazon Rekognition 错误
- terraform - Terraform 无法从私有仓库获取 github 原始文件
- java - IBMMQ 消费者应用程序无法使用 TextMessage(JMSCMQ1049: The character set '1208(UTF-8) Unmappable Action: REPORT)
- javascript - Javascript 函数 - 返回响应
- php - 获取地理定位状态以及用户何时登录账单城市和账单地址 woocommerce
- ios - [反应原生][ios] 'MODULE_NOT_FOUND',@react-native-community/cli