나는 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();
답변
답변
유형이 절대로 null
또는 이 아님을 알고 undefined
있으면를 foo: Bar
없이 선언해야 합니다 ?
. ? Bar
구문을 사용 하여 형식을 선언하면 잠재적으로 정의되지 않았을 수 있으므로 확인해야합니다.
다시 말해, 컴파일러는 요청한 내용을 정확하게 수행합니다. 선택 사항으로하려면 나중에 확인해야합니다.
답변
이것은 OP의 문제는 아니지만 Object is possibly 'null'
우연히 null 유형으로 매개 변수를 선언했을 때 동일한 메시지가 나타납니다.
something: null;
null 값을 할당하는 대신 :
something: string = null;