【发布时间】:2021-07-18 09:40:39
【问题描述】:
我有一个深度嵌套的对象结构,其中包含所有应该有一个value 键的其他对象,我试图保留对象结构并用每个键的值类型替换值。现在我创建了一个类型Result,它几乎可以完成我需要它做的事情,但是,创建的类型也有一个错误。
T[key]['value'] - Type '"value"' cannot be used to index type 'T[key]'.(2536)
我也在为如何做到这一点而苦苦挣扎,如果value 属性不存在,则默认为string
class A<T = string>{
constructor(public value:T){}
}
const data = {
propA: {value:'test'},
nested:{
propA: new A([123]),
propBool: new A(123)
}
}
type Replace<T, A extends {value:any}={value:any}> = T extends object
? { [key in keyof T]: T[key] extends {value:any}? T[key]['value'] : Replace<T[key], A> }
: T;
type Result = Replace<typeof data> //ok
class A<T = string>{
constructor(public value:T){}
}
const data = {
propA: {value:'test'},
nested:{
propA: new A([123]),
propBool: new A(123)
}
}
type Replace<T, A extends {value:any}={value:any}> = T extends object
? { [key in keyof T]: T[key] extends {value:any}? T[key]['value'] : Replace<T[key], A> }
: T;
type Result = Replace<typeof data>
// result
type Result = {
propA: string;
nested: {
propA: number[];
propBool: number;
};
}
【问题讨论】:
-
这看起来和stackoverflow.com/questions/67240685/…一模一样,所以你可以做同样的事情-
T[key]['value' & keyof T[key]] -
@NadiaChibrikova 你能把这个作为答案发给我吗?
标签: typescript typescript-generics