удалить null или undefined из свойств типа - PullRequest
0 голосов
/ 29 октября 2018

Мне нужно объявить тип, который удаляет неопределенное из его типов свойств.

Предположим, у нас есть:

type Type1{
  prop?: number;
}

type Type2{
  prop: number | undefined;
}

type Type3{
  prop: number;
}

Мне нужно определить универсальный тип с именем NoUndefinedFeild<T>, такой что NoUndefinedFeild<Type1> дает тот же тип, что и Type3, и тот же тип, что и NoUndefinedFeild<Type2>.

Я попробовал это

type NoUndefinedFeild<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };

Но это работает только для Type2.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Существует также встроенный тип NonNullable:

type NonNullable<T> = Diff<T, null | undefined>; // Remove null and undefined from T

https://www.typescriptlang.org/docs/handbook/advanced-types.html

0 голосов
/ 20 июля 2019

@ Ответ DShook является неправильным (или, скорее, неполным), потому что OP запрашивает удалить null и undefined из свойств типов, а не из самого типа (явная разница).

Хотя ответ @ Fartab верен, я добавлю к нему, поскольку теперь есть встроенный тип Required, и решение можно переписать так:

type RequiredProperty<T> = { [P in keyof T]: Required<NonNullable<T[P]>>; };

Это сопоставит свойства типов (не самого типа) и гарантирует, что каждый из них не является ни тем, ни другим; Нулевой или неопределенный.

Пример различия между удалением значений null и undefined из типа по сравнению с удалением их из свойств типов (с использованием указанного выше типа RequiredProperty):

type Props = {
  prop?: number | null;
};

type RequiredType = NonNullable<Props>; // { prop?: number | null }
type RequiredProps = RequiredProperty<Props>; // { prop: Required<number> } = { prop: number }
0 голосов
/ 29 октября 2018

Благодаря @artem, решение:

type NoUndefinedField<T> = { [P in keyof T]-?: NoUndefinedField<NonNullable<T[P]>> };

Обратите внимание на синтаксис -? в [P in keyof T]-?, который удаляет необязательность

...