![](/img/trans.png)
[英]Typescript's type inference, why can't the type of data be inferred?
[英]TypeScript's type inference
鑒於以下這些類型,我不確定為什么executor.get()
的推斷類型會根據我調用console.log
的方式而有所不同。
為了您的方便,我提供了 TypeScript 游樂場的鏈接。
interface Stage<T, R> {
consume(element: T): void;
}
function peek<T>(action: (element: T) => void): Stage<T, T> {
return {
consume(element: T) {
action(element);
}
};
}
class Executor<T> {
run<A>(stage1: Stage<T, A>): Executor<A>;
run<A, B>(stage1: Stage<T, A>, stage2: Stage<A, B>): Executor<B>;
run(...stages: Stage<any, any>[]): Executor<any> {
return this;
}
get(): T {
return null as T;
}
}
如果我peek(element => console.log(element))
,那么推斷的get()
返回類型是正確的number
。
const executor = new Executor<number>();
executor.run(
peek(element => console.log(element))
).get();
但是如果我像下面那樣peek(console.log)
,那么推斷的get()
的返回類型是我不明白為什么的any
類型。 我認為因為 console.log 的簽名是console.log
console.log(...data: any[]): void
,所以當我像下面這樣傳遞對console.log
的引用時, TypeScript 推斷element
的類型是any
,但我想要number
,我應該怎么做才能讓 TypeScript 推斷出正確的類型?
const executor = new Executor<number>();
executor.run(
peek(console.log)
).get();
console.log
具有以下類型log(message?: any, ...optionalParams: any[]): void;
. 因此,當調用console.log
時, peek
將推斷T
是any
類型(這是 console.log 的第一個參數的類型)。 要解決此問題,您需要手動告訴 peek 您將期待一個數字:
const executor = new Executor<number>();
executor.run(
peek<number>(console.log)
).get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.