Как сделать свойство необязательным при использовании ReturnType <> - PullRequest
1 голос
/ 27 февраля 2020

У меня есть это:

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>;

Как я могу сказать, что я хочу, чтобы свойство foo было необязательным? Я пробовал это:

export type NotifDefaultState = ReturnType<typeof getDefaultState> & {ts?: any};

но без игры в кости.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

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;
} */

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

1 голос
/ 27 февраля 2020

Вы go "назад" и ослабьте тип. Поскольку вы создаете тип из конкретного экземпляра, имеющего ключ, TypeScript делает вывод, что ключ должен присутствовать.

Вам придется создать интерфейс и экспортировать его.

...