我有这个界面:
export interface IScene<R extends string> {
path: R;
params?: SceneParams;
}
SceneParams界面:
export interface SceneParams {
[key: string]: string;
}
当我创建一个像这样的场景时,这完全可以正常工作
interface PostDetailScene extends IScene<PostRoute.Detail> {
params: PostDetailSceneParams;
}
PostDetailSceneParams:
export interface PostDetailSceneParams extends SceneParams {
postId: string;
}
所有这些代码都会得到正确的类型检查:
// CORRECT
getPathWithParams({
path: PostRoute.Detail,
params: { postId: '4' },
});
getPathWithParams({
path: UserRoute.List,
});
getPathWithParams({
path: UserRoute.List,
params: undefined,
});
// ERROR
getPathWithParams({
path: PostRoute.Detail,
params: undefined,
});
getPathWithParams({
path: PostRoute.Detail,
});
getPathWithParams({
path: UserRoute.List,
params: { wrongParam: 'value' },
});
现在我有一个不想传递任何道具的场景。这个场景是UserListScene:
interface UserListScene extends IScene<UserRoute.List> {
params?: never;
}
您看到我必须显式键入params?: never
(或params?: undefined
-我也不知道在这里应该使用哪种类型,因为在这里,参数实际上/应该永远不会被传递-但是使用{ {1}}编译器也对未定义感到满意,所以我看不出有什么大不同)
我的问题是:是否有一种解决方案可以更改IScene接口,以便在该场景没有参数时不必键入never
或params?: never
?
我只想写:
params?: undefined
或:
interface UserListScene extends IScene<UserRoute.List> {}
编辑:
此功能还应该获得正确的类型检查:
type UserListScene = IScene<UserRoute.List>;
答案 0 :(得分:1)
使用两个界面(实际上这就是您真正拥有的界面):
export interface IScene<R extends string> {
path: R;
}
export interface ISceneWithParams<R extends string> {
path: R;
params: SceneParams;
}