Почему TypeScript неправильно определяет возвращаемый тип?

#typescript

#typescript

Вопрос:

Сообщение TypeScript было правильным ОБНОВЛЕНИЕ:, типом возвращаемого значения этой функции может быть пустая строка.

Приведенный ниже фрагмент не будет компилироваться в TypeScript с strictNullCheck опцией.

Код правильный, но TS ошибочно выводит, что это (id) => id amp;amp; /^[a-z0-9-] $/.test(id) выражение может возвращать среди других значений пустую строку '' и жалуется.

 type Validators<D> = { 
  [K in keyof D]: (value: D[K] | undefined) => true | false | undefined
}

interface Post {
    id?: string
}

const validators: Validators<Post> = {
    // Complains about this line
    id: (id) => id amp;amp; /^[a-z0-9-] $/.test(id) 
}
  

<a rel="noreferrer noopener nofollow" href="https://www.typescriptlang.org/play/#src=type Validators = {
[K in keyof D]: (value: D[K] | undefined) => true | false | undefined
}

interface Post {
id?: string
}

const validators: Validators = {
id: (id) => id && /^[a-z0-9-]+$/.test(id)
}» rel=»nofollow noreferrer»>Игровая площадка

Комментарии:

1. но это выражение будет возвращать пустую строку, если id это пустая строка

2. @artem спасибо, вы правы, я этого не осознавал

Ответ №1:

Небольшой трюк, которому я научился некоторое время назад, чтобы утверждать ненулевые значения, заключается в выполнении double !! .

 type Validators<D> = { 
  [K in keyof D]: (value: D[K] | undefined) => true | false | undefined
}

interface Post {
    id?: string
}

const validators: Validators<Post> = {
    id: (id) => !!id amp;amp; /^[a-z0-9-] $/.test(id)
}
  

Этот код не жалуется, но в чем он не уверен, так это в id переменной. Поступая !!id , вы утверждаете, что это ложь, а затем переворачиваете его, чтобы, по сути, подтвердить его «правдивость».