Тип '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