Я - сопровождающий Redux, и я думаю, что, возможно, я написал этот конкретный фрагмент.
Я не полный эксперт по TS, поэтому в некотором смысле весь "type
против interface
«Меня это тоже немного смущает.
Если вы посмотрите на оригинальный ThunkAction
тип из redux-thunk
набрав , вы увидите, что он определен с помощью ключевого слова type
:
export type ThunkAction<
TReturnType,
TState,
TExtraThunkArg,
TBasicAction extends Action
> = (
dispatch: ThunkDispatch<TState, TExtraThunkArg, TBasicAction>,
getState: () => TState,
extraArgument: TExtraThunkArg,
) => TReturnType;
Насколько я понимаю, TS interface
может расширять еще один interface
, но interface
никогда не может расширять type. So, the fact that
ThunkAction is defined as a
тип means that
AppThunk _must_ also be a
type.
Гипотетически, вы можете определить ThunkAction
как interface
, что, как я думаю будет выглядеть так:
interface ThunkAction {
// declaring a signature here without a field name means this is describing
// a function that matches this signature, vs an object field
<
TReturnType,
TState,
TExtraThunkArg,
TBasicAction extends Action
> = (
dispatch: ThunkDispatch<TState, TExtraThunkArg, TBasicAction>,
getState: () => TState,
extraArgument: TExtraThunkArg,
) => TReturnType
}
Однако на практике это кажется, что объявление типов функций с использованием interface
- редкий случай использования. Интерфейсы обычно используются для объектов, а type
для всего, что не является строго объектом или является производным типом.
Для AppDispatch
, это производный тип, использующий typeof
, поэтому имеет будет type
.