typescript - 使用 ReturnType<> 时如何使属性可选
问题描述
我有这个:
const getDefaultState = () => ({
mainNotifMessage: '(unknown message)',
notifDetails: '(unknown notification details)',
severity: 'info' as 'info' | 'error' | 'warning' | 'success' | undefined,
snackBarOpen: true,
foo: Date.now() as any
});
export type NotifDefaultState = ReturnType<typeof getDefaultState>;
如何告诉 t 我希望 foo 属性是可选的?我试过这个:
export type NotifDefaultState = ReturnType<typeof getDefaultState> & {ts?: any};
但没有骰子。
解决方案
TypeScript 没有任何内置支持以编程方式更改修饰符,例如?
对象readonly
类型的单个键。有关功能请求,请参阅microsoft/TypeScript#32562。在实现这些事情之前,您可以使用实用程序类型Pick
和Omit
,以及交集来构建自己接近的东西。以下实现SelectivePartial
使用条件类型推断的技巧使最终显示的类型成为单个对象而不是丑陋的交集:
type SelectivePartial<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K> extends infer O ?
{ [P in keyof O]: O[P] } : never;
然后你NotifDefaultState
可以这样定义:
export type NotifDefaultState = SelectivePartial<ReturnType<typeof getDefaultState>, "foo">;
/* type NotifDefaultState = {
foo?: any;
mainNotifMessage: string;
notifDetails: string;
severity: "info" | "error" | "warning" | "success" | undefined;
snackBarOpen: boolean;
} */
好的,希望有帮助;祝你好运!
推荐阅读
- gradle - Kotlin 插件错误:无法为 MyTask 类生成代理类
- javascript - 按下一篇文章排序文章列表
- java - 具有以编程方式覆盖的设置的上下文
- spring - Spring Hateoas 与 Spring Mvc
- postgresql - 在 PostgreSQL 中使用 refcursor 返回多个记录集
- python - 使用scrapy下载图像时遇到问题
- php - 将下载的文件保存到文件夹中
- jenkins - 詹金斯工作 dsl 列表视图不起作用
- kubernetes - 从 CLI 升级 Rancher 2 工作负载
- ionic3 - 我的 ion-list 视图的一部分没有显示,我无法滚动直到我在 Ionic3 中看到这些