替换打字稿类型中某些键上的类型

时间:2020-10-09 03:46:02

标签: typescript

在下面的代码中,我试图通过循环键并仅替换符合条件的键来从现有类型创建新类型。

我也在这里使用联合类型。

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']
}

这在最后几行代码中给了我以下错误:

  • “数字”类型不能分配给“字符串”类型。
  • 类型'string []'不能分配给类型'string'。

我的问题是:

  1. 当原始键类型是不满足“ c.n”的数字时,为什么Key extends X被更改为字符串?
  2. 如何将更改应用于联合类型数组的键?在此示例中,c.aa应该从X[]更改为string[]

1 个答案:

答案 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]
}