我正在嘗試自動推斷函式引數型別,如下所示:
const FUNCTION_A = "a";
const FUNCTION_B = "b";
type FunctionKeyType = typeof FUNCTION_A | typeof FUNCTION_B;
function functionA(arg: string): string {
return "A";
}
function functionB(arg: number): string {
return "B";
}
type AnyFunctionType = (arg: any) => string;
const funcs: Record<FunctionKeyType, AnyFunctionType> = {
[FUNCTION_A]: functionA,
[FUNCTION_B]: functionB
}
console.log("A:", funcs[FUNCTION_A]("a")) // works
console.log("B:", funcs[FUNCTION_B](0)) // works
console.log("B:", funcs[FUNCTION_B]("fail")) // should fail typechecking but does not
- 將有大量
functions具有唯一arg型別的型別,但每個型別都將始終呼叫一個引數arg并回傳一個string - 我需要有一個
key=>的機制function,但它不一定需要是Record
有沒有辦法這樣寫AnyFunctionType,當我通過 使用函式時funcs["..."],它會推斷引數的型別?
TS游樂場
uj5u.com熱心網友回復:
當您將型別宣告為時,所有函式Record<string, AnyFunctionType>都被假定為作為引數的型別。AnyFunctionTypeany
如果你想應用一個約束,但推斷出比這更具體的東西,那么你需要使用一個通用函式來制作這個物件。(請參閱issue#47920以了解將來如何解決此問題)
function makeFuncs<T extends Record<string, AnyFunctionType>>(funcs: T) {
return funcs
}
const funcs = makeFuncs({
"a": functionA,
"b": functionB
})
const badFuncs = makeFuncs({
"a": functionA,
"b": functionB
})
console.log("A:", funcs["a"]("a")) // works
console.log("B:", funcs["b"](0)) // works
console.log("B:", funcs["b"]("fail")) // error
它強制函式簽名是正確的:
const badFuncs = makeFuncs({
"a": functionA,
"b": () => 123 // type error
})
操場
uj5u.com熱心網友回復:
您可以使用通用函式來實作此約束。
type AnyFunctionType = (arg: any) => string;
function InferFunctionType<T extends {[k: string]: AnyFunctionType }>(t: T){
return t
}
const funcs = InferFunctionType({
"a": functionA,
"b": functionB,
})
console.log("A:", funcs["a"]("a")) // works
console.log("B:", funcs["b"](0)) // works
console.log("B:", funcs["b"]("fail")) // Here Typechecking gives error
代碼游樂場
uj5u.com熱心網友回復:
您已經說過呼叫將如圖所示,其中函式名稱是編譯時常量。那是好訊息!這意味著你可以做到。:-) 您可以有一個編譯時常量物件來進行查找:
const funcs = {
"a": functionA,
"b": functionB
} as const; // <== Note
console.log("A:", funcs["a"]("a")); // Works
console.log("B:", funcs["b"](0)); // Works
console.log("A wrong:", funcs["a"](0)); // Error as desired
console.log("B wrong:", funcs["b"]("x")); // Error as desired
游樂場鏈接
您還可以獲得完整的 IDE 支持,智能感知會告訴您所需的引數型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466989.html
標籤:打字稿
下一篇:覆寫型別以使其在可選時更簡潔
