typescript - 3.9+ 將 any 擴展成 unknown
3.9 這是預期的變更:擴展了 any 的型別參數不再作為 any 使用
我的程式碼有一些錯誤訊息
類型 'P' 無法用來索引類型 'S'。(2536)
我如何修改這種類型的程式碼 ReplaceValByOwnKey
type ReplaceValByOwnKey<T extends any, S extends any> = { [P in keyof T]: S[P] };
// shift action
type ShiftAction<T extends any[]> = ((...args: T) => any) extends ((arg1: any, ...rest: infer R) => any) ? R : never;
// unshift action
type UnshiftAction<T extends any[], A> = ((args1: A, ...rest: T) => any) extends ((...args: infer R) => any) ? R : never;
// pop action
type PopAction<T extends any[]> = ReplaceValByOwnKey<ShiftAction<T>, T>
// push action
type PushAction<T extends any[], E> = ReplaceValByOwnKey<UnshiftAction<T, any>, T & { [k: string]: E }>;
// test ...
type tuple = ['vue', 'react', 'angular'];
type resultWithShiftAction = ShiftAction<tuple>; // ["react", "angular"]
type resultWithUnshiftAction = UnshiftAction<tuple, 'jquery'>; // ["jquery", "vue", "react", "angular"]
type resultWithPopAction = PopAction<tuple>; // ["vue", "react"]
type resultWithPushAction = PushAction<tuple, 'jquery'>;
遊樂場連結
答案#1
不深入討論你的使用情境,我會說這裡正確的做法可能是使用條件型別來檢查 S 是否可以被 P 索引,並且只有在可以的情況下才進行索引。如果不能這樣索引,接下來要做什麼由你決定(下面我返回 any,但 never 也是合理的):
type ReplaceValByOwnKey<T extends any, S extends any> =
{ [P in keyof T]: P extends keyof S ? S[P] : any };
這應該可以消除定義內的錯誤,並且至少在 S[P] 存在的情況下不會改變任何行為(例如,你的範例程式碼輸出保持不變)。
希望那有幫助;祝你好運!
程式碼的 Playground 連結
