首页 > 解决方案 > 使用 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};

但没有骰子。

标签: typescripttsc

解决方案


TypeScript 没有任何内置支持以编程方式更改修饰符,例如?对象readonly类型的单个键。有关功能请求,请参阅microsoft/TypeScript#32562。在实现这些事情之前,您可以使用实用程序类型PickOmit,以及交集来构建自己接近的东西。以下实现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;
} */

好的,希望有帮助;祝你好运!

Playground 代码链接


推荐阅读