簡體   English   中英

返回值的類型斷言與鍵入 function 返回類型

[英]Type assertion of returned value vs. typing function return type

聲明function 返回值的類型與在其簽名類型中鍵入 function返回值之間有什么區別(如果有)? 假設我們只討論具有單個 return 語句的簡單函數。

interface Foo { foo: number }

interface Bar { bar: Foo[] }

// type assertion
function buzz(foo: Foo) {
  return { bar: [] } as Bar;
}

// typing the function
function fuzz(foo: Foo): Bar {
  return { bar: [] };
}

請參閱示例TypeScript 游樂場

在這種情況下,沒有,因為推理只是將fuzzbuzz鍵入為(foo: Foo) => Bar 您可以看到不同之處,即如果您嘗試在最新返回之前添加另一個if條件,並返回不同的結果:

interface Foo { foo: number }

interface Bar { bar: Foo[] }

// type assertion
function buzz(foo: Foo) {
  // This changes the return type of `buzz` to Bar | object
  if (foo.foo > 10) return {};
  return { bar: [] } as Bar;
}

// typing the function
function fuzz(foo: Foo): Bar {
  // This is a type error, since `fuzz` expects a `Bar` as return type
  if (foo.foo > 10) return {};
  return { bar: [] };
}

在第一種情況下,調整了buzz 在第二個中, fuzz代碼拋出錯誤。

這里的區別在於含義:強制Bar作為返回類型意味着:“我正在聲明 output,所以誰來實現這個需要尊重 output,Bar”。 使用as Bar作為返回類型告訴我們:“好的,現在它返回一個 object,但我確定 output 應該是一個 Bar。無論如何,無論何時發生這種變化,我們都應該相應地改變返回類型”。

暫無
暫無

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

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