[typescript] “오류 TS2533 : 개체가 ‘null’또는 ‘undefined’일 수 있습니다.”를 억제하는 방법은 무엇입니까?

나는 type:

type tSelectProtected = {
  handleSelector?: string,
  data?: tSelectDataItem[],

  wrapperEle?: HTMLElement,
  inputEle?: HTMLElement,
  listEle?: HTMLElement,
  resultEle?: HTMLElement,

  maxVisibleListItems?: number
}

전역 모듈 단위 변수를 선언합니다.

var $protected : tSelectProtected = {};

function1()범위 에서 적절한 가치를 부여하고 있습니다 .

$protected.listEle = document.createElement('DIV');

나중에 function2()범위 내에서 전화합니다.

$protected.listEle.classList.add('visible');

TypeScript 오류가 발생합니다.

error TS2533: Object is possibly 'null' or 'undefined'

if ($protected.listEle) {$protected.listEle}컴파일러를 진정시키기 위해 명시 적으로 검사를 수행 할 수 있지만 대부분의 사소한 경우에는 매우 적합하지 않은 것 같습니다.

TS 컴파일러 검사를 비활성화하지 않고 어떻게이 상황을 처리 할 수 ​​있습니까?



답변

이 기능은 --strictNullChecks컴파일러 플래그가 설정되어 있지 않은지 확인하기 위해 “엄격한 널 검사”라고 합니다.

그러나 존재 null했다 설명한 바와 같이 억 달러 실수 이므로 같은 타이프가 수정 도입 같은 언어를 표시 흥미 롭다. 전원을 켜두는 것이 좋습니다.

이 문제를 해결하는 한 가지 방법 은 예를 들어 값 을 미리 초기화 하여 값이 절대 null또는 아닌지 확인하는 undefined것입니다.

interface SelectProtected {
    readonly wrapperElement: HTMLDivElement;
    readonly inputElement: HTMLInputElement;
}

const selectProtected: SelectProtected = {
    wrapperElement: document.createElement("div"),
    inputElement: document.createElement("input")
};

그러나 대안 옵션에 대해서는 Ryan Cavanaugh의 답변을 참조하십시오!


답변

당신이 표현이 아니라고 외부 수단에서 알고있는 경우 null또는 undefined, 당신은 null이 아닌 주장 연산자를 사용하여 !그 유형을 멀리 강요 :

// Error, some.expr may be null or undefined
let x = some.expr.thing;
// OK
let y = some.expr!.thing;


답변

나는 사용했다 :

if (object !== undefined) {
    // continue - error suppressed when used in this way.
}

또는 유형 강제를 사용할 수 있습니다.

const objectX = object as string

위의 해결 방법 중 하나를 선택하기 전에 원하는 아키텍처를 고려하고 더 큰 그림에 영향을 미치십시오.


답변

OP의 질문에 대한 직접적인 대답은 아니지만 제 경우에는 다음과 같이 설정했습니다.

타이프 라이터 – v3.6.2
tslint –v5.20.0

그리고 다음 코드를 사용하여

const refToElement = useRef(null);

if (refToElement && refToElement.current) {
     refToElement.current.focus(); // Object is possibly 'null' (for refToElement.current)
}

해당 라인의 컴파일러를 억제하여 계속 진행했습니다. linter 오류가 아닌 컴파일러 오류이므로 // tslint:disable-next-line작동하지 않았습니다. 또한, 필요한 경우에만 문서에 따라,이, 드물게 사용되어야한다

const refToElement = useRef(null);

if (refToElement && refToElement.current) {
     // @ts-ignore: Object is possibly 'null'.
     refToElement.current.focus();
}

업데이트 :

Typescript 3.7에서는 선택적 체인을 사용 하여 위의 문제를 다음과 같이 해결할 수 있습니다.

refToElement?.current?.focus();


답변

이 솔루션은 저에게 효과적이었습니다.

  • tsconfig.json으로 이동하여 “strictNullChecks”를 추가하십시오 .

여기에 이미지 설명을 입력하십시오


답변

유형이 절대로 null또는 이 아님을 알고 undefined있으면를 foo: Bar없이 선언해야 합니다 ?. ? Bar구문을 사용 하여 형식을 선언하면 잠재적으로 정의되지 않았을 수 있으므로 확인해야합니다.

다시 말해, 컴파일러는 요청한 내용을 정확하게 수행합니다. 선택 사항으로하려면 나중에 확인해야합니다.


답변

이것은 OP의 문제는 아니지만 Object is possibly 'null'우연히 null 유형으로 매개 변수를 선언했을 때 동일한 메시지가 나타납니다.

something: null;

null 값을 할당하는 대신 :

something: string = null;