Нужно ли мне аннотировать свойства объекта как в классе, так и в интерфейсе в TypeScript?

#typescript

#typescript

Вопрос:

Я начинаю использовать TypeScript и задаю этот вопрос о BP в аннотирующих классах.

Итак, пример:

 interface PluginManagerInterface {
    _plugins: {
        [name: string]: {
            [status: string]: boolean
        }
    }
}

class PluginManager implements PluginManagerInterface {

    _plugins: {
        [key: string]: {
            [status: string]: boolean
        }
    }

    constructor() {
        this._plugins = {};
    }

    // ...code
}
  

Нужно ли мне здесь копировать-вставлять _plugins аннотацию переменной в класс из интерфейса? Или я неправильно использую аннотацию?

Спасибо!

Ответ №1:

Да, вам нужно снова написать типы в классе. Typescript не будет определять типы свойств на основе implements предложений. Поэтому, если вы не укажете тип, он будет any по умолчанию. implements будет проверяться только то, что свойства класса могут быть реализацией для интерфейса (а свойство с типом any будет соответствовать любому типу в интерфейсе).

Вы можете поместить сложный тип в специальный интерфейс или использовать запросы типов:

 interface PluginManagerInterface {
    _plugins: {
        [name: string]: {
            [status: string]: boolean
        }
    }
}

class PluginManager implements PluginManagerInterface {

    _plugins: PluginManagerInterface['_plugins']

    constructor() {
        this._plugins = {};
    }

    // ...code
}
  

Ответ №2:

Я имею в виду, что вы можете просто создать тип или интерфейс из него:

 interface Plugins {
  [name: string]: {
    [status: string]: boolean;
  };
}

interface PluginManagerInterface {
  _plugins: Plugins;
}

class PluginManager implements PluginManagerInterface {
  _plugins: Plugins;

  constructor() {
    this._plugins = {};
  }

  // ...code
}