Может ли интерфейс TypeScript ограничить свойства своего реализующего класса? - PullRequest
1 голос
/ 15 марта 2020

Я бы хотел определить класс, который может иметь любой ключ свойства string, но с указанным c соответствующим типом значения. Я попробовал следующее:

interface MyValue {
  body: string;
  description: string;
}

interface MyInterface {
  [key: string]: MyValue;
}

class MyClass implements MyInterface {}

Я надеялся, что приведенное выше приведет к MyClass, где допустимо следующее:

class MyClass implements MyInterface {
  a = {
    body: "lorem ipsum";
    description: "some latin placeholder",
  };
}

... и следующее недопустимо :

class MyClass implements MyInterface {
  a = "lorem ipsum";
}

Вместо этого я получаю сообщение об ошибке:

Class 'MyClass' incorrectly implements interface 'MyInterface'.
  Index signature is missing in type 'MyClass'.

Есть ли способ использовать класс и при этом достичь желаемого поведения выше?

Спасибо!

1 Ответ

0 голосов
/ 15 марта 2020

Вы не можете сделать это с подписью индекса. Если у вашего интерфейса есть индексная сигнатура, вашему классу он также понадобится.

Вы можете ограничить все ключи (свойства и методы) класса указанным c типом, используя сопоставленный тип:

type MyInterface<K extends PropertyKey> = {
  [P in K] : MyValue
}

class MyClassEmpty implements MyInterface<keyof MyClassEmpty> {}

class MyClassGood implements MyInterface<keyof MyClassGood> {
  a = {
    body: "lorem ipsum",
    description: "some latin placeholder",
  };
}

class MyClassBad implements MyInterface<keyof MyClassBad> {
  a = "lorem ipsum"; // error
}

Playground Link

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