这是因为编译器不能仅基于函数声明检查if type
T
实际拥有财产
id
. 我们可以添加一个约束来告诉编译器将传入的内容将具有
身份证件
属性:
function foo<T extends { id: string }>(x: Omit<T, 'id'>) {
let value: Omit<T, 'id'> = x;
}
foo<MyType>({ timeout: 10, delta: 5 })
你会注意到我没有初始化
value
函数中的变量具有对象文本,这是因为如果不知道完整类型,则无法创建对象文本。我们所知道的
T型
那是has和
身份证件
财产,我们对其他财产一无所知
T型
有,他们有什么类型,如果他们需要。
如果您真的需要在函数中初始化泛型类型的变量,那么(
不安全的
)方法是使用类型断言:
function foo<T extends MyType>(x: Omit<T, 'id'>) {
let value = {
timeout: 10,
delta: 5,
} as unknown as Omit<T, 'id'> // replace unknown with any for ts before 3.0
}