Typescript:省略泛型类型为什么是一个对象?

3
我想知道为什么默认的通用类型是一个对象{}而不是any? 它的行为类似于any,但有点令人困惑。 示例/演示
class Foo<T> {}

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

我需要:

class Foo<T = any> {}

但我想了解背后的原因。我认为这是因为T类似于对象。

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


相关链接:https://github.com/Microsoft/TypeScript/issues/5884 和 https://github.com/Microsoft/TypeScript/issues/5254 和 https://github.com/Microsoft/TypeScript/issues/5884 和 https://github.com/Microsoft/TypeScript/issues/27288 - Paleo
1个回答

1
这是 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。即使没有这个技巧,最终你可能会收到一个错误,提示 {} 不是你所期望的,尽管追踪错误可能是一个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接