[英]Typescript generic function changing argument type
我有一個關於泛型函數的問題(特別是為什么我能夠修改特定類型的對象)
例子 :
interface UserConfig {
name: string;
age: number;
}
let user: UserConfig = {
name: "Eyal",
age: 23,
};
function addTimestamp<T>(arg: T): T {
return { ...arg, timestamp: new Date().toString() };
}
console.log(user); // {name: 'Eyal',age: 23}
user = addTimestamp<UserConfig>(user);
console.log(user); // { name: 'Eyal', age: 23, timestamp: 2022-06-29T16:28:31.524Z }
為什么當它應該只有UserConfig
接口屬性( name
和age
)時我能夠改變user
變量
因為這行不通
...
user.timestamp = "xxxx" // ERROR - Property 'timestamp' does not exist on type 'UserConfig'
首先,您不是在改變“用戶”,而是在創建一個新對象,其中包含用戶的所有字段以及時間戳字段——原始用戶對象不會改變。
TypeScript 在這里沒有抱怨,因為您返回的新對象仍然與原始類型 T兼容——您沒有更改或刪除任何現有屬性,您只是添加了新屬性。 它在 結構上與原始類型兼容。
interface UserConfig {
name: string;
age: number;
}
let user: UserConfig = {
name: "Eyal",
age: 23,
};
function addTimestamp<T>(arg: T): T {
return { ...arg, timestamp: new Date().toString() };
}
let newUser: UserConfig = addTimestamp(user);
console.log(user === newUser); // false
console.log('timestamp' in user); // false
console.log('timestamp' in newUser); // true
let typeTest: UserConfig = (() => {
return {
name: 'Pizza',
age: 49,
isVeryCool: true
}
})(); // compiles just fine
// @ts-expect-error
console.log(typeTest.isVeryCool); // doesn't compile if I remove the directive
console.log('isVeryCool' in typeTest); // true
你可以爭辯說這是一件很奇怪的事情,特別是考慮到 TypeScript 會阻止其他類型的相關添加(例如,嘗試從我的 typeTest 示例中刪除 IIFE 並直接使用文字),但它在技術上與其余部分是正確的類型系統規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.