簡體   English   中英

在 Typescript 中輸入匿名對象而不使用類型斷言

[英]Typing anonymous objects in Typescript without using type assertions

考慮:

type Foo = {
   bar: string,
   baz: number
}

const bars = ['a', 'b', 'c'];
const foos = bars.map<Foo>((bar, i) => {
   return {
     bar,
     baz: i
   }
});

不會強制執行地圖返回值的確切類型,例如我可以說

return {
  bar,
  baz: i,
  extraProp: 'boo!'    // this works! (bad - i want this to fail)
}

它會正常工作。 這與我沒有使用泛型類型並在返回值上使用類型斷言一樣:

return {
  bar,
  baz: i,
  extraProp: 'boo!'   // works (bad)
} as Foo

我能弄清楚要完全強制執行實際類型的唯一方法是創建一個臨時變量:

const returnVal: Foo = {
  bar,
  baz: i,
  // extraProp: 'boo!' // won't work - good! typescript prevented a bug!
}
return returnVal;

是否有任何語法允許創建匿名對象,例如在return語句中允許完全強制執行類型,而不僅僅是類型斷言?

問題是只有在直接分配給參數/變量/返回值時才檢查對象文字是否有額外的屬性。 當您在map上指定類型參數時,將首先使用此簽名首先鍵入箭頭函數:

(bar: string , i: number) => {    
    bar: string,
    baz: number,
    extraProp: string
}

然后檢查這個函數是否與 map 的參數(類型為(bar: string , i: number) => Foo )的兼容性,並且會被發現是兼容的。

一個簡單的解決方法是指定不在map的類型,而是指定箭頭函數的返回類型:

const foos = bars.map((bar, i): Foo => {
    return {
        bar,
        baz: i,
        extra: "" // error here, as expected
    }
});

這不是類型斷言,但您確實需要指定類型,但無論如何您都是在map做的,因此鍵入的數量大致相同。

暫無
暫無

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

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