Уточнение полей, допускающих значение NULL, для проверки

Я пытаюсь заставить компилятор помочь мне с проверкой полезной нагрузки, полученной по сети. Итак, что я хочу сделать, это передать полезную нагрузку JSON по сети и убедиться, что компилятор жалуется, если все поля не установлены. Я знаю, что это можно сделать с помощью функций проверки, но еще до того, как я перейду к части проверки, мне нужно сгенерировать некоторый шаблон, который преобразует тип с полями, допускающими значение NULL, в тип со строгими полями. Таким образом, функции проверки должны иметь следующую подпись

type Validator<T> = (i: T) => Strictify<T>;

Проблема в том, что я не знаю, как заставить Strictify работать. Когда я пишу следующее, это не работает

type Strictify<T> = {
  [K in keyof T]: Exclude<T[K], undefined>
};
type Test = { k?: string };
type StrictTest = Strictify<Test>;

Тип StrictTest должен быть { k: string }, но на самом деле это все еще { k?: string }. Самое интересное, что если я изменю определение Test на { k: string | undefined }, тогда это сработает. Строгий тип - это то, что я ожидаю. Кто-нибудь знает, как заставить все это работать, не расширяя каждые k?: T до k: T | undefined?


person David K.    schedule 26.11.2018    source источник


Ответы (1)


Ваша версия работала бы, если бы тип поля был объявлен как string|undefined. Хотя под strictNullChecks необязательные поля показаны как имеющие тип string|undefined, это не одно и то же, необязательность является свойством поля.

Чтобы удалить необязательный модификатор из поля при использовании гомоморфного отображаемого типа, начиная с typescript 2.8, вы можете добавить -? к типу:

type Strictify<T> = {
  [K in keyof T]-?: Exclude<T[K], undefined>
};
type Test = { k?: string };
type StrictTest = Strictify<Test>;
person Titian Cernicova-Dragomir    schedule 26.11.2018
comment
О, классно. Кстати, это где-нибудь задокументировано? - person David K.; 27.11.2018
comment
@ davidk01 PR — лучшее место, чтобы прочитать об этом: github.com/Microsoft/TypeScript/pull /21919 - person Titian Cernicova-Dragomir; 27.11.2018
comment
Прохладно. Очень признателен. - person David K.; 27.11.2018