[typescript] TypeScript 인터페이스 속성의 유형을 “추출”하는 방법이 있습니까?

일부 인터페이스를 포함하는 라이브러리 X에 대한 입력 파일이 있다고 가정 해 보겠습니다.

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

이 라이브러리로 작업하려면 .NET Framework와 정확히 동일한 유형의 객체를 전달해야합니다 I2.y. 물론 소스 파일에 동일한 인터페이스를 만들 수 있습니다.

interface MyInterface {
    a: I1,
    b: I1,
    c: I1
}

let myVar: MyInterface;

하지만 라이브러리에있는 파일로 최신 상태로 유지해야하는 부담이 있습니다. 게다가 매우 커져서 많은 코드 중복이 발생할 수 있습니다.

따라서 인터페이스의 특정 속성 유형을 “추출”할 수있는 방법이 있습니까? let myVar: typeof I2.y(작동하지 않고 “이름 I2를 찾을 수 없음”오류가 발생 함) 유사 항목 입니다. 미리 감사드립니다.


편집 : TS 운동장에서 조금 플레이 한 후 다음 코드가 내가 원하는 것을 정확히 달성한다는 것을 알았습니다.

declare var x: I2;
let y: typeof x.y;

그러나 중복 변수 x를 선언해야합니다. 나는 그 선언없이 이것을 달성하는 방법을 찾고 있습니다.



답변

이전에는 불가능했지만 다행히 현재는 TypeScript 버전 2.1 이후 입니다. 2016 년 12 월 7 일에 릴리스되었으며 조회 유형 이라고도하는 인덱싱 된 액세스 유형을 도입 합니다 .

구문은 요소 액세스와 똑같이 보이지만 유형 대신 작성됩니다. 따라서 귀하의 경우 :

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

let myVar: I2['y'];  // indexed access type

이제 myVar유형이 I2.y.

TypeScript Playground 에서 확인하십시오 .


답변

인터페이스는 객체의 정의와 같습니다. 그런 다음 y는 I2 개체의 속성이며, 특정 유형의 경우 “익명”입니다.

다른 인터페이스를 사용하여 y를 정의한 다음 다음과 같이 y 유형으로 사용할 수 있습니다.

interface ytype {
   a: I1;
   b: I1;
   c: I1;
}

interface I2 {
    y: ytype;
    z: any;
}

인터페이스를 파일에 넣고 추출을 사용하여 프로젝트의 다른 파일로 가져올 수 있습니다.

export interface ytype {
   a: I1;
   b: I1;
   c: I1;
}



 export interface I2 {
        y: ytype;
        z: any;
    }

다음과 같이 가져올 수 있습니다.

   import {I1, I2, ytype} from 'your_file'


답변