programing

유형 'null'은 유형 'T'에 할당할 수 없습니다.

minimums 2023. 2. 27. 23:03
반응형

유형 'null'은 유형 'T'에 할당할 수 없습니다.

나는 이 일반적인 방법을 가지고 있다.

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


... //somewhere
const x = Foo.bar<number | null>(1);

구문 오류가 발생함

TS2322: 유형 'null'은 유형 'T'에 할당할 수 없습니다.

제가 이걸 컴파일 할 수 있을 것 같아요.T그럴 수도 있겠지요null.

이 문제를 해결하는 적절한 방법은 무엇인가?

반환 유형을 다음과 같이 선언해야 합니다.null또는 꺼짐strictNullCheckstsconfig로

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

또는 null을 입력할 수 있습니다.as any예.

 return null as any;

버전 3.9.5 이후 TypeScript는strictNullChecksnumbers그리고.strings몇 가지 예를 들면요.예를 들어, 다음 코드는 컴파일 중에 오류를 발생시킵니다.

let x: number = null;

이 에러를 회피하려면 , 다음의 2개의 옵션이 있습니다.

  • 세트strictNullChecks=falsetsconfig.json.
  • 변수 유형을 다음과 같이 선언합니다.any:
    let x: any = null;
    

넣을 수 있습니다.

return null!;

그것은 나에게 효과가 있었다.

여기서 null이 아닌 인수의 null 케이스를 제거하기 위해 함수 오버로드를 제안합니다.고려사항:

class Foo { 
    public static bar<T>(x: T): T // overload
    public static bar(x: null): null // overload
    public static bar<T>(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

따라서 구현에는 다음과 같은 유형이 있습니다.T | null그러나 null이 아닌 타입의 과부하로 인해 반환 타입이 있습니다.T그래서 가능성이 전혀 없어.

저도 같은 문제에 직면했고, 그것이 사실 타이프스크립트의 현재 제한에 관한 것임을 알게 되었습니다.

현재 값과 같은 값을 체크하여 T와 같은 유형 파라미터를 좁히는 방법은 없습니다.

https://stackoverflow.com/a/68898908/10694438 를 참조해 주세요.

저 같은 경우에는 다음을 해야 했습니다.

class Node<T> {
    private value: T
    private next: Node<T> | null

    constructor(value: T, next: Node<T> | null = null) {
        this.value = value
        this.next = next
    }
}

언급URL : https://stackoverflow.com/questions/59715119/type-null-is-not-assignable-to-type-t

반응형