typescript - 打字稿:为什么省略的泛型类型是对象?
问题描述
我想知道为什么默认的泛型类型是对象{}
而不是对象any
?它的行为类似于 any,但有点令人困惑。
class Foo<T> {}
// The type of this:
const foo = new Foo();
// is {} but expected any or error.
我可以使用:
class Foo<T = any> {}
但我想知道背后的背景。我认为这是因为它T
是对象状的。
另一个问题:如何强制开发人员为泛型类设置类型?
解决方案
这是打字稿关于泛型类型参数的默认行为。它试图推断它们,如果它不能默认为最窄的可能类型,如果你没有任何约束T
是{}
正如@Paleo 在评论中指出的那样,有一个建议为此创建一个strict
选项,但目前不可用:
同时,如果我们想强制指定参数,我们可以使用构造函数参数,以便在未指定类型参数时得到错误:
class Foo<T = void> {
constructor(...a: T extends void ? ["Supply A type arg"] : []) {
}
}
const foo1 = new Foo(); // err
const foo2 = new Foo<number>();
注意我会谨慎使用这个技巧,更喜欢给构造函数提供一个参数,让编译器推断T
。即使没有这个技巧,最终你可能会得到一个{}
不是你所期望的错误,尽管跟踪错误可能是一个问题。
推荐阅读
- java - 由于明显的类路径冲突,球衣 WadlAutoDiscoverable 转换错误?
- pandas - 在 Pandas df 中获取值的行和列索引
- laravel - maatwebsite excel 多个表格并排
- excel - VBA代码将不同单元格中的特定单词复制并粘贴到另一个工作表
- python - 发送带有正文中表格的电子邮件,不带附件
- javascript - 如何在 Kendo 日期时间选择器 javascript 中禁用时间范围
- javascript - Ruby on rails -- Jquery 在另一个 post 请求之前没有提交 put 请求
- .net - 将 ContentItem 转换为强类型
- django - Heroku:图像在一段时间后不显示
- java - 保存更改的 TableView 列 Java 的宽度