Тип '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 проблему
Ответ #1
Ответ на вопрос: Тип 'null' не может быть присвоен типу 'T'
Вы должны объявить возвращаемый тип как 9X_typescript null
или отключить strictNullChecks
в вашем tsconfig
public static bar(x: T): T | null
или введите 9X_typescript null as any
, например
return null as any;
Ответ #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;
- Удаление чеков не решает вопроса о том, как это исправить. Это как вынуть батарею из дымово ...
Ответ #3
Ответ на вопрос: Тип 'null' не может быть присвоен типу 'T'
Можно поставить
return null!;
У меня это сработало
9X_typescript
Ответ #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 возможности нулевого значения.
-
4
-
11
-
3
-
8
-
12
-
9
-
7
-
4
-
2
-
5
-
4
-
3
-
3
-
5
-
1
-
4
-
16
-
2
-
1
-
27
-
23
-
5
-
6
-
4
-
6
-
2
-
5
-
5
-
1
-
8
-
3
-
4
-
14
-
4
-
4
-
9
-
4
-
7
-
6
-
1
-
10
-
3
-
3
-
3
-
3
-
4
-
3
-
6
-
8
-
2