Typescript: свойство Omit из универсального интерфейса c - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать интерфейс, в котором отсутствует свойство данного типа. Для этого я использовал Omit, что приводит к типу, так что это неправильно по определению. Однако, если бы это был не универсальный c интерфейс, он работал бы отлично.

Рассмотрим следующий пример.

interface IBaseType {
  prop1: number;
  prop2: string;
  match: boolean;
}

interface OmitMatchNoGeneric extends Omit<IBaseType, "match"> {}

interface OmitMatch<T extends { match: any }> extends Omit<T, "match"> {}

function test(genericArg: OmitMatch<IBaseType>, nonGenericArg: OmitMatchNoGeneric) {
  nonGenericArg.prop1 = 5; // the properties are suggested
  genericArg.prop1 = 5; // intelliSense fails to list the properties
}

В этом примере intelliSense для VSCode показывает список свойств для аргумент non-generi c, но он не может сделать это для аргумента generi c. Аргумент generi c рассматривается как объект любого типа.

Моя главная проблема заключается в том, что если я не должен использовать Omit, что еще я могу использовать? И если бы я хотел реализовать это с помощью типов, а не интерфейсов, как я мог бы это сделать?

1 Ответ

2 голосов
/ 08 марта 2020

TypeScript выдает ошибку на вашем обобщенном c интерфейсе:

Интерфейс может расширять только тип объекта или пересечение типов объектов со статически известными элементами.

Вот почему это не работает. (См. Ошибку на детской площадке .)

Вместо этого вы можете использовать тип:

type OmitMatch<T extends { match: any }> = Omit<T, "match">;

Это работает правильно. ( На детской площадке .)

...