Создать интерфейс на основе свойств других интерфейсов - PullRequest
0 голосов
/ 24 июня 2019

У меня два интерфейса, Workflow и WorkflowVersion

workflow.model.ts

import { WorkflowVersion } from './workflow-version.model';

export interface Workflow{
    name: string;
    ID: number;
    workflowVersions: WorkflowVersion[];
}

workflow-version.model.ts

export interface WorkflowVersion{
    versionID: number;
    lastPublished: string;
    environmentID: number;
}

Я бы хотел создать интерфейс, который «выравнивает» их. Этот новый интерфейс WorkflowFlat должен содержать все свойства необъектного типа обоих интерфейсов. В настоящее время у меня есть это:

рабочий процесс-flat.model.ts

export interface WorkflowFlat {
    name: string;
    ID: number;
    versionID: number;
    lastPublished: string;
    environmentID: number;
}

Модель, описанная выше, достигает этого, но она кажется повторяющейся. Если я хочу добавить description свойство к WorkflowVersion в будущем, я должен был бы не забыть добавить его также к WorkflowFlat. Есть ли способ заставить модель автоматически взять все свойства из двух интерфейсов и затем создать новый интерфейс с необъектными?

1 Ответ

3 голосов
/ 24 июня 2019

Ответ Аарона Билла близок (извините, я пока не могу комментировать), но он не удаляет должным образом все ключи, которые расширяют object, поэтому они потребуются для окончательного типа как key: never, который не хотел.

В следующем фрагменте достигается цель путем повторного использования помощника уровня типа из удивительного tycho01 / типичного репо :

export type NonMatchingPropNames<T, X> = { [K in keyof T]: T[K] extends X ? never : K }[keyof T];

export type NonMatchingProps<T, X> = Pick<T, NonMatchingPropNames<T, X>>;

type PrimitiveValuesOf<T> = NonMatchingProps<T, object>;

type A = PrimitiveValuesOf<Workflow & WorkflowVersion>;

const a: A = {
  name: '',
  ID: 0,
  versionID: 1,
  lastPublished: '',
  environmentID: 2
}; // OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...