在推断类参数时,将忽略泛型约束



当用new实例化泛型类时,将推断其类型参数。在这种情况下,一般约束似乎被忽略了。

type MyType = { a?: number, b?: number };
class MyClass<T extends MyType = MyType> {
constructor(t: T) {}
method(t: T) {}
}
const myClass1 = new MyClass<MyType>({ a: 1 });
myClass1.method({ b: 1 });

const myClass2 = new MyClass({ a: 1 });
// Why is this error?
// T should extend `MyType` even though type was inferred from a constructor parameter.
myClass2.method({ b: 1 });

游乐场链接

这是一个错误还是一种意图?泛型类的类型推理可以被阻止吗?

这是有意为之。泛型类型的extends子句(在本例中为T(仅为传递的类型指定约束

类型{ a: number }确实满足了约束,因为b是可选的。

type T0 = { a: number } extends MyType ? true : false
// -> true

成功满足约束时,类型{ a: number }将变为类型T(不继承MyType(。由于b不是{ a: number }的一部分,因此会出现错误。

最新更新