【发布时间】:2021-06-06 20:34:26
【问题描述】:
问题:
当我在使用对象扩展构造所述对象时忘记将嵌套字段添加到类型为 T 的对象时,为什么不会收到编译时错误?
示例:
interface User {
userId: number;
profile: {
username: string
}
}
function updateUsername(user: User): User {
return {
...user,
profile: {
// Error (as expected)
}
}
}
function updateUsernameGeneric<T extends User>(user: T): T {
return {
...user,
profile: {
// No error (unexpected... why?)
}
}
}
我自己对答案的猜测:
我所能想象的是,TypeScript 允许子类型删除它们的超级属性,这使得对于User 的某些子类型T,profile 属性可能不包含任何特性。 (如果是这样,我不知道 TypeScript 允许你这样做......)
TypeScript 版本 4.1.2
【问题讨论】:
-
这很有趣。我们实际上可以将您的泛型函数用于violate the type system,并在类型为非
undefined的地方获取undefined。这可能是编译器错误。 -
是的,很有趣,即使
{ ...user, profile: undefined }也被接受了
标签: typescript typescript-generics