Тип 'null' не может быть присвоен типу 'T'

У меня есть этот общий метод

class Foo { public static bar(x: T): T { ... if(x === null) return null; //<------- syntax error ... } } ... //somewhere const x = Foo.bar(1); 

Я получаю синтаксическую 9X_typescript ошибку

TS2322: тип "null" нельзя присвоить 9X_vanilla-typescript типу "T".

Я ожидаю, что это будет скомпилировано, потому 9X_typescript что T может быть null.

как правильно решить эту 9X_vanilla-typescript проблему

116
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Тип 'null' не может быть присвоен типу 'T'

Вы должны объявить возвращаемый тип как 9X_typescript null или отключить strictNullChecks в вашем tsconfig

public static bar(x: T): T | null 

или введите 9X_typescript null as any, например

 return null as any; 

189
0

Ответ #2

Ответ на вопрос: Тип 'null' не может быть присвоен типу 'T'

Начиная с версии 3.9.5, TypeScript применяет 9X_vanilla-typescript strictNullChecks к numbers и strings, и это лишь некоторые из них. Например, следующий 9X_atscript код вызовет ошибку во время компиляции:

let x: number = null; 

Чтобы 9X_typescript избежать этой ошибки, у вас есть два варианта:

  • Установите strictNullChecks=false в tsconfig.json.
  • Объявите свой тип переменной как any:
    let x: any = null; 

50
2

  • Удаление чеков не решает вопроса о том, как это исправить. Это как вынуть батарею из дымово ...

Ответ #3

Ответ на вопрос: Тип 'null' не может быть присвоен типу 'T'

Можно поставить

return null!; 

У меня это сработало

9X_typescript

12
0

Ответ #4

Ответ на вопрос: Тип 'null' не может быть присвоен типу 'T'

Я бы предложил здесь перегрузки функций, чтобы 9X_typescript удалить нулевой регистр для аргументов, не 9X_vanilla-typescript допускающих значения NULL. Учтите:

class Foo { public static bar(x: T): T // overload public static bar(x: null): null // overload public static bar(x: T) { if (x === null) { return null; } else return x; } } const x = Foo.bar(1 as number); // x is number, never a null const y = Foo.bar(null); // its null const z = Foo.bar('s' as string | null); // its string | null 

Итак, реализация 9X_typescript имеет тип T | null, но благодаря перегрузке для 9X_vanilla-typescript типов, которые никогда не являются нулевыми, у 9X_atscript нас есть возвращаемый тип T, поэтому нет 9X_atscript возможности нулевого значения.

3
0