為什么沒有丟失錯誤?
interface User {
// way 1
foo(): string;
foo2(x:number): string;
// way 2
normal: () => string;
normal2: (x:number) => string;
}
let user: User = {
// way 1
foo: () => '',
foo2: () => '', // why no error since x is missing
// way 2
normal: () => '',
normal2: () => '', // why no error since x is missing
};
看到這個打字稿游樂場
uj5u.com熱心網友回復:
如果呼叫 (x:number)=>string而不傳入x,則會An argument for 'x' was not provided.出錯。
但這不是你在做什么
您正在做的是分配()=>string給(x:number)=>string,這是有效的。當您分配()=>string給 時(x:number)=>string,編譯器會問:可以()=>string像(x:number)=>string?
即可以()=>string接收 anumber并吐出 a string,就像(x:number)=>string做什么一樣?
答案是肯定的,()=>string技術上可以取任何數,但只要忽略它,然后回傳一個字串,與取入的數無關。因此,()=>string可賦值為(x:number)=>string
uj5u.com熱心網友回復:
甲低級元數函式被分配給一個更高的arity一種,只要它的回傳型別是相容并且其中引數是本是兼容的。
在您的情況下,因為函式沒有引數并回傳 a string,所以它們是兼容的。
TS游樂場
type NumFn = (n: number) => string;
declare const isCompatible: (() => string) extends NumFn ? true : false; // true
uj5u.com熱心網友回復:
就像上面的答案似乎只有在您呼叫不帶引數的函式時才能檢測到,我敢打賭這與 typescript 背景關系型別有關(我也在此處學習)
函式引數一次檢查一個,每個對應引數位置的型別相互檢查。如果您根本不想指定型別,TypeScript 的背景關系型別可以推斷引數型別,因為函式值直接分配給 SearchFunc 型別的變數。在這里,我們的函式運算式的回傳型別也被它回傳的值所暗示 typescript 手冊
interface Counter {
(start: number): string;
interval: number;
foo: (x:number) => string;
bar(x:number):string;
reset(): void;
}
function getCounter(): Counter {
let counter = function (s...
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/392706.html
標籤:javascript 打字稿
上一篇:如何禁用來自@typescript-eslint的警告?
下一篇:包裝匿名函式的引數或結果
