Реализуйте тип generi c для свойства функции интерфейса - PullRequest
1 голос
/ 29 марта 2020

Из redux-devtools-extension я хотел реализовать интерфейс EnhancerOptions, который содержит следующее свойство функции (или метод или, однако, на него следует ссылаться, когда речь идет об интерфейсах):

stateSanitizer?: <S>(state: S, index: number) => S;

Дело в том, что я не смог предоставить тип для S (форма состояния, если хотите), например, что-то вроде этого:

const options: EnhancerOptions = {
  stateSanitizer: (state: MyState, index: number) => state.data ? { ...state, data: '<<LONG_BLOB>>' } ? state
};

дает мне следующую ошибку:

Types of parameters 'state' and 'state' are incompatible.
Type 'S' is not assignable to type 'MyState'.ts(2322)

Действительно ли возможно предоставить тип S из реализации, а не во время использования, как в:

options.satetSanitizer<MyState>(state, index);

Как мне go о реализации такого интерфейса, так как для чтобы быть действительно полезным, функция, которую получает stateSanitizer, должна работать в соответствии с формой моего состояния, как вы можете видеть в state.data , поскольку data никогда не будет существовать для типа S

1 Ответ

1 голос
/ 29 марта 2020

Не уверен, что вам это нужно, но вы можете указать <S> на уровне интерфейса следующим образом:

type MyState = {
  data: any
}

type EnhancerOptions<S> = {
  stateSanitizer?: (state: S, index: number) => S;
}

const options: EnhancerOptions<MyState> = {
  stateSanitizer: (state: MyState, index: number) => state.data ? { ...state, data: '<<LONG_BLOB>>' } : state
};

const state: MyState = {
  data: '123'
}

options.stateSanitizer(state, 10)

Надеюсь, это поможет или хотя бы даст представление о том, как найти ваше реальное решение.

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