我想知道为什么默认的通用类型是对象{}
而不是any
?
它的行为类似任何,但有点令人困惑。
class Foo<T> {}
// The type of this:
const foo = new Foo();
// is {} but expected any or error.
我可以使用:
class Foo<T = any> {}
但是我想知道背后的背景。我认为这是因为T
是对象。
另一个问题:如何强制开发人员为通用类设置类型?
答案 0 :(得分:1)
这是关于通用类型参数的默认行为键入脚本。它会尝试推断它们,如果不能,则默认为最窄的类型,如果您对T
没有任何限制,则为{}
@Paleo在评论中指出,有一个proposal为此创建一个strict
选项,但这目前不可用:
同时,如果我们要强制执行参数的指定,则可以使用构造函数的参数,如果未指定type参数,则会出现错误:
class Foo<T = void> {
constructor(...a: T extends void ? ["Supply A type arg"] : []) {
}
}
const foo1 = new Foo(); // err
const foo2 = new Foo<number>();
注意,我会尽量少用这个技巧,而更喜欢在构造函数中使用一个参数,该参数可以让编译器推断T
。即使没有这个技巧,最终您仍然可能会得到一个错误,{}
不是您期望的,尽管查找错误可能是一个问题。