簡體   English   中英

為什么我可以將未知屬性分配給 typescript 中的文字 object?

[英]Why can I assign unknown properties to literal object in typescript?

  type ExpectedType = Array<{ name: number, gender?: string }>

  function go1(p: ExpectedType) {

  }  

  function f() {
    const a = [{name: 1, age: 2}]
    go1(a)                   // doesn't complain
    go1([{name: 1, age: 2}]) // complain 'Object literal may only specify known...'
    go1(['no matter'].map(n => ({name: 1, age: 2}))) // doesn't complain
  }

typescript代碼如上,我的問題是最后三行不一樣嗎? 為什么一線可以通過,二線投訴,三線通過?

同樣在 typescript 操場上: 操場

將 var a 分配給 go1() 的參數時,似乎將變量 a 分配給另一個 para 變量。 在這種情況下,因為 a 的類型與參數變量類型兼容。 但是如果你把類型改成{name:number, gender:string },還是會出現類型錯誤。

當分配一個字面量 object 作為參數時,在這種情況下沒有類型轉換,因此編譯器可以檢測到這種類型錯誤。

更多詳情請參閱此處

TypeScript 結構類型系統的基本規則是,如果 y 至少具有與 x 相同的成員,則 x 與 y 兼容。 例如:

interface Named {
    name: string;
}

let x: Named;
// y's inferred type is { name: string; location: string; }
let y = { name: "Alice", location: "Seattle" };
x = y;

為了檢查 y 是否可以分配給 x,編譯器檢查 x 的每個屬性以在 y 中找到對應的兼容屬性。 在這種情況下, y 必須有一個名為 name 的成員,它是一個字符串。 確實如此,因此允許分配。

經過一番研究,我發現答案在 TypeScript 的文檔中。

所以最后 3 行之間的區別在於:第 2 行中的參數是 object,而其他 2 行不是,TypeScript 以不同的方式對待字面參數和非字面參數:

多余的財產檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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