TypeScript将参数设为可选(如果未提供)

时间:2019-03-17 20:13:20

标签: javascript typescript types

我有这个界面:

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接口,以便在该场景没有参数时不必键入neverparams?: never

我只想写:

params?: undefined

或:

interface UserListScene extends IScene<UserRoute.List> {}

编辑:

此功能还应该获得正确的类型检查:

type UserListScene = IScene<UserRoute.List>;

1 个答案:

答案 0 :(得分:1)

使用两个界面(实际上这就是您真正拥有的界面):

export interface IScene<R extends string> {
  path: R;
}

export interface ISceneWithParams<R extends string> {
  path: R;
  params: SceneParams;
}