對 Typescript 函數類型感到困惑

程序員

我對以下打字稿代碼有些困惑:

function greet(name: string): string {
    return `Hello ${name}`;
}

function logGreeting(name: string): void {
    console.log(`Hello ${name}`);
}

function doSomething(name: string, callbackFn: (name: string) => void) {
    callbackFn(name);
}

doSomething('Zion', logGreeting);
doSomething('John', greet);

這段代碼片段的最後一行讓我感到困惑。doSomething函數中,我指定了callbackFn應該接受name,應該是 a string,並且它應該不返回任何內容 ( void)。

但是,在doSomething('John', greet),greet不返回void,但 Typescript 不會拋出錯誤。為什麼會這樣?

謝謝!

阿誇奧

這是對這種行為的解釋:

你告訴打字稿你想要一個不通過指定返回任何東西的函數,void但你已經知道了。

所以 Typescript 不關心你的回調返回什麼,因為它不打算被使用。

如果您在string那時更改了預期的簽名,如果您的回調函數沒有返回string.

在我看到你的問題之前我不知道這種行為,所以我根據我的例子通過改變預期的簽名來進行測試。

所以下面的代碼:

//i only changed your callback signature from void to string

function greet(name: string): string {
  return `Hello ${name}`;
}

function logGreeting(name: string): void {
  console.log(`Hello ${name}`);
}

function doSomething(name: string, callbackFn: (name: string) => string) {
  callbackFn(name);
}

doSomething('Zion', logGreeting);
doSomething('John', greet);

將返回以下錯誤:

est.ts:13:21 - error TS2345: Argument of type '(name: string) => void' is not assignable to parameter of type '(name: string) => string'.
  Type 'void' is not assignable to type 'string'.

13 doSomething('Zion', logGreeting);
                       ~~~~~~~~~~~


Found 1 error

所以對我來說,這種行為是有道理的。如果我的解釋不夠清楚,請告訴我,在這種情況下,我會盡量使其更清楚。

結論:主要是 TS 不期望得到返回值,所以如果你的函數返回一些東西,這不是問題,但你將不被允許使用它......

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

嘗試在 Typescript 中對函數進行類型檢查

對 Lambda 函數變量感到困惑

對製作一個類的數組感到困惑

如何將 TypeScript 泛型用於可以返回對像或數組的函數?

如何在 TypeScript 的類或對像中要求特定的數據類型?

對這種表達函數的特定 JavaScript 方式感到困惑

對 getBoundingClientRect 感到困惑

TypeScript 對像類型轉換,當兩個對象的鍵名不同時

對將數組推入數組感到困惑,JavaScript

如何對返回對象屬性的函數進行強類型化?

帶有類的 Swift 擴展:如何使函數返回對象的真實類型?

兩個等效的泛型類型在函數體中被區別對待

在為對象提供類型時,TypeScript 中沒有帶有“字符串”類型參數的索引簽名錯誤

包裝異步函數的函數的 TypeScript 類型定義

切換和映射問題 - 被調用的對像類型不是函數或函數指針

如何解決錯誤:調用的對像類型'char'不是函數或函數指針

如何在 TypeScript 中使用嵌套對象?“對象”類型上不存在屬性

鍵入一個通用函數,該函數從 Typescript 中的對象和(深層)嵌套對像中檢索數據

在 Kotlin 中從函數和推斷類型返回匿名對象

定義一個函數來刪除 Julia 中的對像類型?

類型錯誤:dict 對像不可調用(在 Thread 函數內)

動態映射對像中的所有類型的函數

為什麼對像類型是javascript中的函數?

類型錯誤:'int' 對像不能用 + 函數迭代

Object Property 方法和 TypeScript 中對函數有很好的推斷

在 Typescript 中,如何指定可以返回多種類型的函數的返回類型?

擴展泛型函數參數類型 - Typescript

在對象 Typescript/React 中映射數組

有沒有辦法將類型限制為僅在 Typescript 中的新對象?