Получите строгий тип из класса, который проверен - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть класс Typescript, который можно проверить, и после проверки тип его полей гарантирован.Но проверяемый класс должен быть допустимым, чтобы принимать пользовательский ввод.Могу ли я использовать производный строгий тип из допустимого класса?

В основном : у меня есть класс с неявным интерфейсом {value: string | undefined}, и я хочу автоматически получить тип {value: string} из него,Это возможно?

В более конкретных терминах у меня есть такой класс:

class Validatable {
  value: string | undefined = undefined
}

(в моем реальном коде это должен быть класс из-за того, как работает валидация, но я нене думаю, что детали проверки важны для этого вопроса)

Этот класс может быть проверен ala:

function getValid (inst: Validatable) {
  const errors = validate(inst)
  if (errors.length > 0) throw new Error("Invalid")
  return inst
}

const inst = new Validatable()
inst.value = "foo"
getValid(inst).value
                ^-- this type is string | undefined 
                    but we know it must be string

Мне бы хотелось, чтобы автоматически был получен строгий интерфейс {value: string}.Это возможно?

1 Ответ

1 голос
/ 20 сентября 2019

Если вы просто хотите удалить все | undefined из типа, вы можете использовать сопоставленный тип:

class Validatable {
  value: string | undefined = undefined
}
type RequiredNotNullOrUndefined<T> = {
  [P in keyof T]-?: Exclude<T[P], null | undefined>
}

function getValid (inst: Validatable) {
  return inst as RequiredNotNullOrUndefined<Validatable>  // <-- we can guarantee field type now
}

const inst = new Validatable()
inst.value = "foo"
getValid(inst).value // string

Play

Примечание: RequiredNotNullOrUndefined аналогичен предопределенному типу Required, но Required удалит только опциональность из типа, не удалит | undefined | null из любого типа свойства, эта версия делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...