首页 > 解决方案 > 覆盖接口类型但保持形状与嵌套对象

问题描述

我有一个用于定义 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。有任何想法吗?

标签: typescripttypescript-typings

解决方案


如果我正确理解了这个问题,您可以通过扩展子界面来做到这一点。顺便把定义翻了一下,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;
  }
}

这保持了基本接口的形状,并且如果它被更改将引发编译时错误。

在此处输入图像描述


推荐阅读