typescript - 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'>;
游乐场链接
解决方案
在不深入研究您的用例的情况下,我想说在这里做的正确事情可能是使用条件类型来检查是否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]
确实存在的情况下不会改变任何行为(例如,您的示例代码输出保持不变)。
希望有帮助;祝你好运!
推荐阅读
- python - How do you calculate the sum of only the first three numbers in a list in Python?
- javascript - 如何用程序或 OO 语言实现“forall”(数学)
- c# - 在实体框架核心中更新具有一对多关系的连接实体
- javascript - How to prevent anyPicker from taking user minutes?
- python - How to slice a cluster from a particular column
- java - Need to parse the JSON ARRAYS that are inside the JSON Object in JAVA
- swift - 使用 MFMessageComposeViewController 快速打开带有文本和 url 的短信应用程序
- java - The executed string value does not match to the hard coded value
- sql-server - Performance of SELECT * in an Inline Table-Valued Function
- google-cloud-platform - 如何使用 TextIO 读取文本文件并返回附加输入字段?