【发布时间】:2020-10-09 15:43:36
【问题描述】:
在下面的代码中,我试图通过循环键并仅替换与条件匹配的键,从现有类型创建一个新类型。
我在这里也使用联合类型。
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”。
我的问题是:
- 为什么
c.n变成一个字符串,而原来的key类型是一个不满足“Key extends X”的数字? - 如何将更改应用于联合类型数组的键?在此示例中,
c.aa应从X[]更改为string[]
【问题讨论】:
-
我明天可以仔细研究一下,但是“Key extends X”实际上没有意义,因为您将密钥本身与接口的联合进行比较。您尝试替换的实际情况是什么?
-
谢谢琳达!我设法找到了我的错误并在下面发布了一个错误,但如果您想查看它并让我知道是否有任何改进,我会很高兴。再次感谢!
标签: typescript