typescript - 覆盖接口类型但保持形状与嵌套对象
问题描述
我有一个用于定义 NoSQL 文档模式形状的界面。这包含字符串、数组、嵌套对象等。例如,我有这样的东西:
interface IStudentSchema {
name: string;
age: string;
foo: {
a: number;
b: [number, number];
c: string;
}
}
我想创建另一个保持相同形状的接口,但每个值的类型要替换为某个接口(类型为对象时除外),例如,我想要下面这样的东西。请注意,它还保留原始类型,并将其用作泛型。
interface IStudentSchemaFieldInfo {
name: ISchemaField<string>;
age: ISchemaField<string>;
foo: {
a: ISchemaField<number>;
b: ISchemaField<[number, number]>;
c: ISchemaField<string>;
}
}
有没有办法做到这一点,以便在我修改原始模式接口时收到编译时警告?到目前为止,我不得不手动让它们保持同步。
我几乎可以通过 using 在没有嵌套对象的情况下做到这一点Record<keyof IStudentSchema, ISchemaField>
,但这仍然没有为接口指定泛型ISchemaField
。有任何想法吗?
解决方案
如果我正确理解了这个问题,您可以通过扩展子界面来做到这一点。顺便把定义翻了一下,Schema有ISchemaField
定义。
interface MysqlObject<T> {
method<T>(): boolean;
}
type ISchemaField<T> = T | MysqlObject<T>;
interface IStudentSchema {
name: ISchemaField<string>;
age: ISchemaField<string>;
foo: {
a: ISchemaField<number>;
b: ISchemaField<[number, number]>;
c: ISchemaField<string>;
}
}
interface IStudent extends IStudentSchema {
name: string;
age: string;
foo: {
a: number;
b: [number, number];
c: string;
}
}
这保持了基本接口的形状,并且如果它被更改将引发编译时错误。
推荐阅读
- facebook - 如何在 Facebook Pages API 中重置营业时间
- r - 对绘图的特定范围内的值进行分组
- c - 两条逻辑相同的 C 指令给出不同的结果
- vbscript - VBScript - 我们可以通过代码找出以秒为单位的持续时间吗
- python - Select column dynamically in Pandas dataframe based on values in a list or another column
- python - 如何使用pyqt5在python中制作每周时间表?
- javascript - fetch 在 await 之后仍然返回 Promise
- reactjs - 获取数组的最后一个元素,但在按日期排序之前
- ffmpeg - MOOV atom not found - 有没有办法从损坏的 mp4 中提取音频?
- ubuntu - Ubuntu 桌面应用程序会在 Ubuntu Touch OS 和使用 Electron 的设备上运行吗?