반응형
정의되지 않은 검사 후에도 유형 스크립트 "error TS2532: 개체가 '정의되지 않음'일 수 있음"
저는 그것을 사용하려고 합니다.--strict
에 대한 옵션.tsc
하지만 저는 이해할 수 없는 "이상한" 사건에 부딪혔습니다.
내가 쓴다면:
function testStrict(input: {query?: {[prop: string]: string}}) {
if (input.query) {
Object.keys(input.query).forEach(key => {
input.query[key];
})
}
return input;
}
컴파일러가 다음에 대해 불평합니다.
test.ts(5,9): 오류 TS2532: 개체가 '정의되지 않음'일 수 있습니다.
(문제가 되는 대목은input.query[key];
)
이해할 수 없는 것은 함수의 첫 번째 줄에 있는 if guard에서 정의되지 않은 것을 이미 확인했다는 것입니다.if (input.query)
그렇다면 컴파일러는 왜 그것이 정의되지 않을 수 있다고 생각합니까?
개체에 액세스하기 전에 다음과 같은 동일한 가드를 추가하여 이 문제를 해결했습니다.
function testStrict(input: {query?: {[prop: string]: string}}) {
if (input.query) {
Object.keys(input.query).forEach(key => {
if (input.query) {
input.query[key];
}
})
}
return input;
}
그런데 왜 똑같은 전화가 또 필요한지 이해가 안 됩니다.
왜냐하면 두 번째 접근은input.query
화살표 함수가 전달된 다른 함수 내부에서 발생합니다.forEach
흐름 분석은 함수 경계를 교차하지 않으므로 다른 함수에 있으므로 다시 검정해야 합니다.
이중 테스트의 대안은 로컬 변수를 사용하는 것입니다. 변수 유형은 할당 시 잠겨 있고 다음을 포함하지 않기 때문입니다.undefined
유형:
function testStrict(input: { query?: { [prop: string]: string } }) {
if (input.query) {
const query = input.query;
Object.keys(input.query).forEach(key => {
query[key];
})
}
return input;
}
언급URL : https://stackoverflow.com/questions/49610779/typescript-error-ts2532-object-is-possibly-undefined-even-after-undefined-c
반응형
'programing' 카테고리의 다른 글
MySQL의 TIMESTAMP 사용 대 직접 타임스탬프 저장 (0) | 2023.07.24 |
---|---|
파일을 다운로드한 후 Ajax를 통해 다른 페이지로 리디렉션 (0) | 2023.07.24 |
유형 스크립트 어설션과 같은 유형 가드 (0) | 2023.07.19 |
Numpy를 사용하여 파생물을 어떻게 계산합니까? (0) | 2023.07.19 |
파이썬에서 문자열을 타이틀 케이스로 변환하는 방법은 무엇입니까? (0) | 2023.07.19 |