ситуация
'user' does not exist on type 'DefaultRootState'.
Я пытался решить ее, но не нашел решения.это мой репозиторий
ошибка
C:/Users/taiga/Github/Typescript/typescript-admin/admin/src/secure/components/Nav.tsx
TypeScript error in C:/Users/taiga/Github/Typescript/typescript-admin/admin/src/secure/components/Nav.tsx(44,50):
Property 'user' does not exist on type 'DefaultRootState'. TS2339
Nav.tsx
class Nav extends Component<{ user: User }> {
state = {
redirect: false
};
handleClick = async () => {
await axios.post('logout', {});
this.setState({
redirect: true
});
};
render() {
if (this.state.redirect) {
return <Redirect to = {'/login'} />;
}
return (
<nav className = "navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
<ul className = "my-2 my-md-0 mr-md-3">
<Link to = {'/profile'} className = "p-2 text-white">
{this.props.user.name}
</Link>
</ul>
</nav>
);
}
}
export default connect((state) => ({ user: state.user }))(Nav);
user.ts
mport { Role } from './role';
export class User {
id: number;
first_name: string;
last_name: string;
email: string;
role: Role;
permissions: string[];
constructor(
id = 0,
first_name = '',
last_name = '',
email = '',
role = new Role(),
permissions: string[] = []
) {
this.id = id;
this.first_name = first_name;
this.last_name = last_name;
this.email = email;
this.role = role;
this.permissions = permissions;
}
setUserReducer.ts
import { User } from '../../classes/user';
const setUserReducer = (
state = { user: new User() },
action: { type: string; user: User }
) => {
switch (action.type) {
case 'SET_USER':
return {
...state,
user: action.user
};
default:
return state;
}
};
export default setUserReducer;
Проблема в том, что connect
HOC не знает, что тип state
— это тип состояния вашего конкретного приложения, а не просто любой тип состояния. Когда он не знает тип вашего конкретного состояния, он предполагает, что состояние имеет тип DefaultRootState
, который определен в пакете типов react-redux как пустой объект {}
.
Есть несколько способов решить эту проблему. Одна из возможностей, рекомендованная пакетом типов, состоит в том, чтобы переопределить определение DefaultRootState
и заменить его фактическим интерфейсом состояния вашего приложения.
Этот интерфейс может быть дополнен пользователями для добавления типов по умолчанию для корневого состояния при использовании react-redux. Используйте расширение модуля, чтобы добавить собственное определение типа в файл your_custom_type.d.ts. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
Другая возможность, которую проще реализовать, — объявить ожидаемый тип состояния внутри вашей функции mapStateToProps
.
export default connect((state: {user: User}) => ({ user: state.user }))(Nav);
Теперь typescript знает, что у вашего state
есть свойство user
с типом User
.
Вы также можете установить общие аргументы для функции connect
при ее вызове, хотя я бы рекомендовал использовать предыдущий метод.
export default connect<{user: User}, {}, {}, {user: User}>((state) => ({ user: state.user }))(Nav);