【发布时间】:2019-09-28 11:31:57
【问题描述】:
我有一个通用接口,我希望其中一个属性只包含来自另一个属性的键,并且具有相同的类型......
interface IMyInterface<T> {
propA: T;
propB: { [key in keyof T]?: T[key] };
}
这很好,我以前做过很多次类似的事情......基本上我希望它根据我传递给 propA 的内容来推断 T 是什么。
但这是我的问题,我有一本包含许多 IMyInterface 类型的字典....
interface IMyDictionary {
[key: string]: IMyInterface;
}
这就是我的问题所在,上面的定义需要一个泛型类型......但是我使用的任何类型都将应用于每个属性。如果我使用任何比它失败的点,因为在声明我的字典时它假定一切都是任何的。
interface IInterfaceA {
name: string;
age: number;
}
const objA: IInterfaceA = {
name: 'John',
age: 18
}
const myDictionary: IMyDictionary {
test1: {
propA: objA,
propB: { age: 40 }
}
}
所以基本上,当将值分配给上面的 myDictionary 时,我希望它推断 propA 的类型为 IInterfaceA,并且在 propB 中只允许属性名称为字符串类型,年龄为数字类型。
我可以通过不定义类型 IMyDictionary 并一项一项地创建每个项目,然后将它们分配给一个新对象 (myDictionary) 来轻松做到这一点....
const test1: IMyInterface = {
propA: objA,
propB: { age: 40 }
}
const myDictionary = { test1 }
这将推断 test1 的泛型类型,然后推断 myDictionary 的类型,使用确切的属性名称,而不是字符串数组。但如果可能的话,我宁愿使用普通的旧对象赋值语法。
我想不出一种方法来声明 IMyDictionary 的类型以强制它推断 IMyInterface 的每个实例的泛型类型。或者,我对定义 IMyInterface 以推断 propB 的属性和类型的不同方法持开放态度。
提前致谢!
【问题讨论】:
标签: typescript