машинописный текст: реализация интерфейса с использованием указанных c объектов в качестве функции arg - PullRequest
0 голосов
/ 27 апреля 2020

Это проще объяснить, посмотрев на реальный код:

interface FooInterface {
  bar: (flags: { [key: string]: string }) => void;
}

export class Foo implements FooInterface {
  bar(flags: { myFlag: string }) {}
}

Я хочу, чтобы любой, кто реализует FooInterface.bar, передавал объект. Меня не волнуют ключи.

Однако, когда я реализовал его в классе Foo и назвал ключ как myFlag, я получил ошибку, что этот ключ не существует в интерфейсе. См. Полную ошибку ниже.

Как сказать Typescript игнорировать ключи в реализованных классах?

Ошибка, которую я получил:

src/extensions/test/test.provider.ts:24:3 - error TS2416: Property 'bar' in type 'Foo' is not assignable to the same property in base type 'FooInterface'.
  Type '(flags: { myFlag: string; }) => void' is not assignable to type '(flags: { [key: string]: string; }) => void'.
    Types of parameters 'flags' and 'flags' are incompatible.
      Property 'myFlag' is missing in type '{ [key: string]: string; }' but required in type '{ myFlag: string; }'.

24   bar(flags: { myFlag: string }) {}
     ~~~

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Проблема в том, что вы говорите, что myFlag должно быть string, но тип { [key: string]: string } не гарантирует, что ключ myflag действительно существует. Таким образом, он не может удовлетворить тип string.

Если вы сделаете ключ myFlag необязательным, он будет работать, тогда вам просто нужно проверить его на существование.

interface FooInterface {
  bar: (flags: { [key: string]: string }) => void;
}

export class Foo implements FooInterface {
  bar(flags: { myFlag?: string }) {
    if (flags.myFlag) {
      console.log(flags.myFlag) // logs a string
    }
  }
}

Детская площадка


Если вы хотите принудительно указать, что myFlag предоставляется при вызове bar класса Foo, то ответ @ leonardfactory - это то, что вам нужно.

1 голос
/ 27 апреля 2020

Используя общие c наборы, вы можете заставить флаги быть объектом со строковыми значениями, а затем указать тип в реализации класса:

interface FooInterface<T extends { [key: string]: string }> {
  bar: (flags: T) => void;
}

type BarFlags = { myFlag: string };

export class Foo implements FooInterface<BarFlags> {
  bar(flags: BarFlags) {}
}

Playground Link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...