#javascript #typescript #interface #react-redux
#javascript #typescript #интерфейс #реагировать-redux
Вопрос:
Приступив к созданию модуля redux, я создал следующие файлы:
//state.tsx
export default interface State {
readonly user: any;
readonly isLoggedIn: boolean;
}
//types.tsx
export default {
REQUEST: 'authentication/REQUEST',
SUCCESS: 'authentication/SUCCESS',
FAILURE: 'authentication/FAILURE',
LOGOUT: 'authentication/LOGOUT'
};
//reducers.tsx
import Types from './types';
import State from './state';
import { Reducer, AnyAction } from 'redux';
const initialState: State = {
user: null,
isLoggedIn: false
};
export default class {
reducer: Reducer<State> = (
state: State = initialState,
action: AnyAction
) => {
// brahbrah
};
}
//index.tsx
import reducer from './reducers';
import Types from './types';
import State from './state';
export default {
reducer,
Types,
// How to export State in this default export?
};
но я не уверен, как экспортировать определение интерфейса состояния в index.tsx.
Когда я просто вставляю State
в export, это говорит мне 'State' only refers to a type, but is being used as a value here.
, и я понимаю, что это неправильный путь, но что нужно для экспорта этого определения?
Комментарии:
1. Проблема в том, что вы пытаетесь экспортировать объект, но типы и интерфейсы Typescript существуют только до компиляции. Каким было бы значение объекта для этого ключа? Я согласен, что для TS было бы логично поддерживать это формирование, поскольку вы можете просто экспортировать интерфейс отдельно, но, насколько я знаю, вы не можете этого сделать в данный момент, вам нужно будет экспортировать интерфейс отдельно.
2. Спасибо, что дали мне объяснение, пожалуйста, опубликуйте что-нибудь, если хотите отметить ответ на этот вопрос. Действительно, на данный момент я использую индивидуальный
export type AuthenticationState = State
. Кроме того, во-первых, я не уверен, что объединение reducer, action types и state interface в один экспорт по умолчанию является хорошей практикой в дизайне. Типы действий и интерфейс состояния, по-видимому, имеют характеристики, отличные от reducer.
Ответ №1:
Проблема в том, что вы пытаетесь экспортировать объект, но типы и интерфейсы Typescript существуют только до компиляции. Каким было бы значение объекта для этого ключа?
// Typescript
interface Foo {};
export default {
Foo,
};
// Compiled Javascript
export default {
Foo: ???
};
Я согласен, что для TS было бы логично поддерживать это формирование, поскольку вы можете просто экспортировать интерфейс отдельно, но, насколько я знаю, вы не можете этого сделать в данный момент, вам нужен отдельный экспорт.
export interface Foo {};
export default {
// Rest of the things
};