>

Typescript에서 공유 "type"속성을 가진 공용체 유형을 만들었습니다.

export type Instruction =
  | { type: 'local.set', name: string, value: Expression }
  | { type: 'i32.const', value: number }
  | { type: 'i32.add', left: Expression, right: Expression };

그리고 'type'속성 값을 키로 사용하고 함수를 값으로 사용하여 객체를 만들고 싶습니다. 이렇게 :

const visitor: Record<Instruction['type'], (instruction: Instruction) => void> = {
   'local.set': (instruction) => {},
   'i32.const': (instruction) => {},
   'i32.add': (instruction) => {},
}

그러나 'instruction'매개 변수를 입력하는 것이 너무 일반적입니다. 함수 내에서 명령어에 액세스 할 수있는 속성을 알고 싶습니다. 어떻게 만들 수 있습니까? Record 'type'속성의 모든 키가있는 type Instruction 유형과 각각 Instruction 값으로 입력 하시겠습니까?

다시 말해;내가 이것을하면 Typescript가 유형을 유추 할 수 있습니다.

const instruction: Instruction = { type: 'local.set' }; // TS knows about the missing 'name' and 'value' properties

그러나 나는 다음과 같은 것을하고 싶다 :

const instruction: Instruction[where type = 'local.set'] = { type: 'local.set' };

그게 가능하고 어떻게?

  • 답변 # 1

    사용자 정의 매핑 유형을 사용하여 type 그런 다음 Extract 조합 구성 요소를 가져 오는 조건부 유형 Instruction 현재 속성과 동일한 유형입니다.

    export type Instruction =
        | { type: 'local.set', name: string, value: Expression }
        | { type: 'i32.const', value: number }
        | { type: 'i32.add', left: Expression, right: Expression };
    type Visitor<T extends { type: string}> = {
        [P in T['type']]: (instruction: Extract<T, { type: P }>) => void
    }
    const visitor: Visitor<Instruction> = {
        'local.set': (instruction) => { instruction.name},
        'i32.const': (instruction) => { instruction.value },
        'i32.add': (instruction) => {  instruction.right },
    }
    
    

    운동장 링크

  • 이전 r - facet_wrap을 사용할 때 x 축 레이블을 위에서 아래로 이동하는 방법은 무엇입니까?
  • 다음 php - CodeIgniter에서 볼 수 있도록 컨트롤러에서 데이터를 전달하면 정의되지 않은 변수가 발생합니다