在下面的代码中,我试图通过循环键并仅替换符合条件的键来从现有类型创建新类型。
我也在这里使用联合类型。
class A {}
class B {
constructor(public a: A, public n: number, public aa: A[]) {}
}
type X = A | B
type ReplaceKeyTypes<Type extends X, NewKeyType> = {
[Key in keyof Type]: Key extends X ? NewKeyType : Type[Key]
}
const a: A = new A()
const b: B = new B(a, 1, [a, a])
const c: ReplaceKeyTypes<B, string> = {
a: 'test',
n: 2,
aa: ['xyz']
}
这在最后几行代码中给了我以下错误:
我的问题是:
c.n
”的数字时,为什么Key extends X
被更改为字符串?c.aa
应该从X[]
更改为string[]
答案 0 :(得分:1)
似乎在进行Key in keyof Type
时您会得到原义密钥,即命名该密钥的字符串。我忘记了使用Type[Key]
来获取键的值类型。为了解决并支持数组的情况,这是我想到的:
type ReplaceKeyTypes<Type extends X, NewKeyType> = {
[Key in keyof Type]: Type[Key] extends X[]
? NewKeyType[]
: Type[Key] extends X
? NewKeyType
: Type[Key]
}