Typescript - возвращаемый тип, который является частью всего интерфейса (проверьте, реализует ли он другой интерфейс) - PullRequest
0 голосов
/ 15 января 2020

У меня есть общий c редуктор, тип возвращаемого значения которого TableState.

const reducerFactory = ..... = (): TableState => ....

TableState:

 interface TableState {
  filters: Filter;
  data: TableData;
  isLoading: boolean;
}

Каждый компонент, использующий эту фабрику редуктора реализует TableState. Например,

interface SalesReportState implements TableState {
  someCommonField: string;
}

Сборка приложения завершается неудачно, поскольку типы не совпадают. Я мог бы сделать someCommonField?: string;, но someCommonField должен быть обязательным.

Существует ли функция Typescript, которая возвращает тип, просто проверяет , если тип таблицы реализует состояние таблицы? Таким образом, тип возвращаемого значения должен быть некоторого типа, который гарантирует, что это экземпляр TableState, а не тип TableState.

1 Ответ

0 голосов
/ 15 января 2020

Если вы хотите знать, реализует ли объект TableState, вы можете использовать:

  1. instanceof
if (obj instanceof TableState) // returns true if object implements TableState

работает только с абстрактным классом

Тип-охранники . Пример:
let obj = {}; // an object you want to check

/**
  * A discriminator is a property which determines if the object in question is
  * a TableState 
  */

function isTableState(obj: any): obj is TableState {
  return obj &&
    obj.filter &&
    obj.data &&
    obj.isLoading && typeof(obj.isLoading) === 'boolean';
}

// check phase
if (isTableState(obj)) {
  // object is automatically casted to TableState
}

PS: Если вы хотите расширить интерфейс с другим интерфейсом, используйте extends РЕДАКТИРОВАТЬ: я не знаю типа Filter и TableData, является ли это интерфейс или класс? Ответ может измениться снова, в зависимости от типа

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