首页 > 解决方案 > 打字稿:为什么省略的泛型类型是对象?

问题描述

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

示例/演示

class Foo<T> {}

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

我可以使用:

class Foo<T = any> {}

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

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

标签: typescriptgenericsdefault

解决方案


这是打字稿关于泛型类型参数的默认行为。它试图推断它们,如果它不能默认为最窄的可能类型,如果你没有任何约束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。即使没有这个技巧,最终你可能会得到一个{}不是你所期望的错误,尽管跟踪错误可能是一个问题。


推荐阅读