sourcecode

형식 스크립트 속성이 유니언 유형에 없습니다.

copyscript 2023. 4. 4. 21:56
반응형

형식 스크립트 속성이 유니언 유형에 없습니다.

이것은 몇 번인가 마주친 상황입니다만, 꽤 간단하다고 생각됩니다만, 타입을 어느 쪽에도 설정하지 않는 솔루션을 찾을 수 없습니다.

함수는 두 개의 다른 개체 중 하나를 인수로 사용하여 수신된 개체를 확인하고 대응하는 필드를 반환합니다.

이것은 문제의 간단한 버전이지만, 문제는 두 개체가 서로 겹치지 않는 속성으로만 구분할 수 있고 다른 유형에는 없기 때문에 속성에 액세스할 수 없다는 것입니다.

type Obj1 = {
  message: string
}

type Obj2 = {
  text: string
}

const getText = (obj: Obj1 |obj2): string => {
  if (obj.message) {
    return obj.message
  }

  return obj.text
}

활자를 좁혀야 해요.이 작업은 연산자를 사용하여 수행할 수 있습니다.

const getText = (obj: Obj1 | Obj2): string => {
  if ("message" in obj) {
    return obj.message
  }

  return obj.text
}

오브젝트는 다음 중 하나에 캐스팅할 수 있습니다.Obj1또는Obj2:

type Obj1 = {
  message: string
}

type Obj2 = {
  text: string
}

const getText = (obj: Obj1 | Obj2): string => {
  if ((obj as Obj1).message) {
    return (obj as Obj1).message
  }

  return (obj as Obj2).text
}

이 문제에 대한 진짜 대답은 소유자가 한 질문에 따르면 다음과 같습니다.

하지만 당신이 사용하고 있는 시간이 있을 수 있습니다.your defined type와 함께primitive type이 방법으로는 내가 여기서 직면한 문제가 상황이기 때문에 위의 해결책은 작동하지 않을 것이다.

type Obj1 = {
  message: string
}

const getText = (obj: Obj1 |string): string => {
  if (obj.message) {
    return obj.message
  }

  return obj.text
}

이 시나리오는 위에서 설명한 솔루션이 고객에게 완벽하지 않기 때문에typeof✌️

const getText = (obj: Obj1 | string): string => {
  if (typeof obj !== 'string') {
    return obj.message
  }

  return obj.text
}

는 타이프스크립트를 추천합니다.

import { is } from 'typescript-is';

...

const getText = (obj: Obj1 | Obj2): string => {
  if (is<Obj1>(obj)) {
    return obj1.message;
  }

  return obj2.text;
};

언급URL : https://stackoverflow.com/questions/58974640/typescript-property-does-not-exist-on-union-type

반응형