打字稿:为什么遗漏的泛型类型是对象?

时间:2019-01-30 13:39:08

标签: typescript generics default

我想知道为什么默认的通用类型是对象{}而不是any? 它的行为类似任何,但有点令人困惑。

Example / Demo

class Foo<T> {}

// The type of this:
const foo = new Foo();
// is {} but expected any or error.

我可以使用:

class Foo<T = any> {}

但是我想知道背后的背景。我认为这是因为T是对象。

另一个问题:如何强制开发人员为通用类设置类型?

1 个答案:

答案 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。即使没有这个技巧,最终您仍然可能会得到一个错误,{}不是您期望的,尽管查找错误可能是一个问题。