【发布时间】:2020-01-09 10:55:59
【问题描述】:
我实现了一个通用函数来将选项与默认选项合并:
// definition
protected defaultOptions<T>(options: T, type: new () => T): T {
return {
...options,
...new type(),
};
}
它就像一个魅力,但我总是需要将类型作为第二个参数传递:
// use it like this
upload(file: File, options: FilesUploadOptions) {
options = this.defaultOptions(options, FilesUploadOptions);
...
...
}
问题:
有一种方法可以达到相同的结果,但删除方法 defaultOptions 的第二个参数并使用第一个参数的类型获取并创建新实例?
// definition
protected defaultOptions<T>(options: T): T {
const type = ???????; // some smart type generics here :)
return {
...options,
...new type(),
};
}
通过这种方式,我可以像这样简单地使用它:
upload(file: File, options: FilesUploadOptions) {
options = this.defaultOptions(options);
...
...
}
谢谢!
【问题讨论】:
-
TypeScript 编译为 JavaScript,这是实际运行的。你会如何想象这在 JavaScript 中工作?你可能会做类似
new options.constructor()的事情,假设options参数本身是一个零参数构造函数的类实例,但TypeScript 将无法验证这是否有效。 -
这是一个相关问题,解决了打字稿无法验证此类事情的原因:stackoverflow.com/questions/36138095/…。基本上,
constructor的类型就是Function,但是constructor函数在javascript 中有特殊的行为(它是新的)。即使使用最新版本的打字稿,情况仍然如此。
标签: typescript typescript-generics