打字稿:为什么省略的泛型类型是一个对象?
Typescript: Why is an omitted generic type an object?
我想知道为什么默认泛型类型是对象 {}
而不是 any
?
它的行为类似于 any,但有点令人困惑。
class Foo<T> {}
// The type of this:
const foo = new Foo();
// is {} but expected any or error.
我可以使用:
class Foo<T = any> {}
但我想知道背后的背景。我认为这是因为 T
是类对象。
另一个问题:如何强制开发人员为泛型设置类型 class?
这是 typescript 对于泛型类型参数的默认行为。它会尝试推断它们,如果不能,则默认为尽可能窄的类型,如果您对 T
没有任何限制,则为 {}
正如@Paleo 在评论中指出的那样,有一个 proposal 可以为此创建一个 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
。即使没有这个技巧,最终你可能会得到一个错误 {}
不是你所期望的,尽管追查错误可能是一个问题。
我想知道为什么默认泛型类型是对象 {}
而不是 any
?
它的行为类似于 any,但有点令人困惑。
class Foo<T> {}
// The type of this:
const foo = new Foo();
// is {} but expected any or error.
我可以使用:
class Foo<T = any> {}
但我想知道背后的背景。我认为这是因为 T
是类对象。
另一个问题:如何强制开发人员为泛型设置类型 class?
这是 typescript 对于泛型类型参数的默认行为。它会尝试推断它们,如果不能,则默认为尽可能窄的类型,如果您对 T
没有任何限制,则为 {}
正如@Paleo 在评论中指出的那样,有一个 proposal 可以为此创建一个 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
。即使没有这个技巧,最终你可能会得到一个错误 {}
不是你所期望的,尽管追查错误可能是一个问题。