簡體   English   中英

打字稿通用函數更改參數類型

[英]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接口屬性( nameage )時我能夠改變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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM