programing

정의되지 않은 검사 후에도 유형 스크립트 "error TS2532: 개체가 '정의되지 않음'일 수 있음"

yellowcard 2023. 7. 19. 21:18
반응형

정의되지 않은 검사 후에도 유형 스크립트 "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

반응형