当用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 }
的一部分,因此会出现错误。