我對以下打字稿代碼有些困惑:
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] 删除。
我来说两句