我有以下代碼:
export type FooParams = {
foo1: { x: number };
foo2: { y: string };
};
export type FooKey = keyof FooParams; // or export type FooKey = "foo1" | "foo2";
export interface FooAction<T extends FooKey> {
execute: (params: FooParams[T]) => void;
}
const foo1Action: FooAction<"foo1"> = {
execute: (params) => {
console.log(params.x);
},
};
const foo2Action: FooAction<"foo2"> = {
execute: (params) => {
console.log(params.y);
},
};
export const fooActions: Record<FooKey, FooAction<FooKey>> = {
foo1: foo1Action,
foo2: foo2Action,
};
我不能強輸入變數fooActions,以便FooAction為每個強制一個FooKey。在上面的示例中,我有以下錯誤。
Type 'FooAction<"foo1">' is not assignable to type 'FooAction<keyof FooParams>'.
Type 'keyof FooParams' is not assignable to type '"foo1"'.
Type '"foo2"' is not assignable to type '"foo1"'.ts(2322)
知道如何正確宣告fooActions型別嗎?
uj5u.com熱心網友回復:
FooAction<FooKey>裝置execute將具有型別(params: FooParams[FooKey]) => void,而該型別又將決議為(params: { x: number } | { y: string }) => void;. 這意味著它必須是一個同時處理{ x: number }和的函式{ y: number }。因此,型別物件的所有值Record<FooKey, FooAction<FooKey>>都必須處理兩種型別,而foo1Action只能foo2Action處理一種型別或另一種型別。
您希望鍵入fooActions鍵和型別之間的相關性。您可以使用自定義映射型別來做到這一點:
type FooActionMap = {
[P in FooKey]: FooAction<P>
}
export const fooActions: FooActionMap = {
foo1: foo1Action,
foo2: foo2Action,
};
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/419261.html
標籤:
