Переопределить тип интерфейса, но сохранить форму с вложенными объектами - PullRequest
1 голос
/ 12 апреля 2020

У меня есть интерфейс, который я использую для определения формы схемы документа No SQL. Он содержит строки, массивы, вложенные объекты и т. Д. c. Например, у меня есть что-то вроде этого:

interface IStudentSchema {
  name: string;
  age: string;
  foo: {
    a: number;
    b: [number, number];
    c: string;
  }
}

Я хочу создать другой интерфейс, который поддерживает ту же форму, но тип каждого значения должен быть заменен определенным интерфейсом (кроме случаев, когда тип является объектом ), Например, я хочу что-то вроде этого ниже. Обратите внимание, что он также поддерживает исходный тип и использует его как обобщенный c.

interface IStudentSchemaFieldInfo {
  name: ISchemaField<string>;
  age: ISchemaField<string>;
  foo: {
    a: ISchemaField<number>;
    b: ISchemaField<[number, number]>;
    c: ISchemaField<string>;
  }
}

. Есть ли способ сделать это, чтобы я получил предупреждение во время компиляции если я изменю оригинальный интерфейс схемы? До сих пор мне приходилось держать их в синхронизированном состоянии c.

. Я почти могу сделать это, вложенные объекты не используются с помощью Record<keyof IStudentSchema, ISchemaField>, но это также не дает обобщений, которые должны быть указаны для ISchemaField интерфейс. Есть идеи?

1 Ответ

0 голосов
/ 13 апреля 2020

Если я правильно понимаю вопрос, вы можете сделать это, расширив дочерний интерфейс. Я перевернул определение, кстати, у схемы есть определение * 1003. *.

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;
  }
}

. Это поддерживает форму базового интерфейса и выдаст ошибку времени компиляции, если она будет изменена.

enter image description here

...