首页 > 解决方案 > 3.9+ 扩展任何成为扩展未知

问题描述

3.9这是有意更改类型参数,扩展任何不再作为任何行为

我的代码有一些错误信息

类型“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'>;

游乐场链接

标签: typescript

解决方案


在不深入研究您的用例的情况下,我想说在这里做的正确事情可能是使用条件类型来检查是否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 代码链接


推荐阅读