별도의 파일에서 typescript 인터페이스를 선언하고 가져 오는 방법


84

필자는 타이프 스크립트 기반 프로젝트에서 자체 파일에 여러 인터페이스를 정의하고 싶습니다. 여기에서 프로덕션 용 클래스와 테스트 용 모의를 구현합니다. 그러나 올바른 구문이 무엇인지 알 수 없습니다. 인터페이스를 선언하고 구현하는 방법에 대한 많은 자습서를 찾았지만 모두 동일한 파일에 인터페이스와 파생 클래스를 모두 사소한 구현으로 포함하고 있으며 이는 실제 환경이 아닙니다. 인터페이스를 내보내고 가져 오는 올바른 방법은 무엇입니까?

답변:


118

정의 된 파일에서 인터페이스를 내보내고 사용하려는 위치에 가져와야합니다.

에서 IfcSampleInterface.ts:

export interface IfcSampleInterface {
   key: string;
   value: string;
}

SampleInterface.ts

import { IfcSampleInterface } from './IfcSampleInterface';
let sampleVar: IfcSampleInterface;

5
이것은 처음에 시도한 구문이지만 오류가 발생합니다.
snort

1
@snort 어떤 유형의 오류가 발생했는지 자세히 설명해 주시겠습니까?
Ajay

문제는 Aurelia에서 typename을 키로 사용할 수 없다는 것입니다 (또는 올바르게 선언하는 방법을 모르겠습니다). 오류는 "[BTAuthService] 이름을 찾을 수 없음"입니다.이 코드는 다음 오류를 제공합니다. container.registerSingleton (BTAuthService, MockAuthService); 먼저 인터페이스를 var에 할당하고 registerSingleton에 전달하면 오류가 발생하지 않습니다.
2016 년

TS / JS 생성자와 형식 이름에 대해 뭔가 오해하고 있다고 생각합니다.
2016 년

트랜스 파일 된 코드에서 인터페이스 유형이 제거되므로 오류가 발생합니다. 내 불완전한 질문에 대한 정답으로 표시합니다. 진짜 문제는이 특정 경우에 인터페이스 이름을 형식 이름으로 사용하려고한다는 것입니다.
snort

65

정의 ( d.ts) 파일 및 네임 스페이스를 사용합니다 . 이런 방식으로 모듈을 가져 오거나 내보낼 필요가 없습니다. DefinitelyTyped 프로젝트에는이 를 수행하는 방법에 대한 지침 과 수많은 예제 가 있습니다.


6
이것은 정답 IMO입니다. 파일이 인터페이스 만 정의하는 경우 이것이 선호되는 방법이며 훨씬 깔끔합니다.
orad

9
당신이있는 경우 module.tsmodule.d.ts같은 폴더에, 컴파일러는 건너 뛰고 module.d.ts당신의 선언이 고려되지 않도록 파일을. d.ts파일 이름을 바꾸 거나 다른 폴더로 이동하십시오. 이 방법은 적절한 모듈 이있는 경우 좋지만 모듈간에 유형 을 공유 하려면을 사용하는 것이 좋습니다 import .. from ...
jpenna

5
이것이 어떻게 받아 들여질 수있는 대답인가. 올바른 방향으로 기울어 져 있다고 생각할 수도 있지만 (아마도 그렇습니다) Artem이 암시하는 답을 찾기 위해 검색해야하는 기사 목록에 대한 일반적인 링크는 "나는 인터넷 "검색 가서, 공산주의를 설명하지 않을
airtonix

d.ts반응 프로젝트에 추가 했지만 여전히 인터페이스를 가져와야합니다.
Hamid Mayeli 2011

따라서 내부적으로 유형을 공유하기 위해 선언 파일을 사용할 것을 제안하고 있습니까? 이것은 전체 프로젝트에서 전 세계적으로 유형을 사용할 수있게하지 않습니까? 또한 자바 스크립트 코드가 내부 목적이 아닌 소비자를 위해 유형을 노출하려는 경우에만 선언 파일의 사용을 보았습니다.
gaurav5430

11

몇 개의 인터페이스 만 내보내기

여러 내보내기를 분산하지 않고 하나의 단일 export {}블록으로 그룹화 할 수 있습니다 (이 경우 파일default 유형을 선언해서는 안 됨).

// interfaces.ts
interface IWords {
  [key: string]: string; 
}

interface INumbers {
  [key: string]: number; 
}

interface IBooleans {
  [key: string]: boolean; 
}

interface IValues {
  [key: string]: string | number; 
}

interface IStructures {
  [key: string]: INumbers | IBooleans | IValues;
}

export {
  // not exporting IWords | INumbers
  IBooleans,
  IValues,
  IStructures,
}

가져 오기 예

import { IBooleans, IValues, IStructures } from 'interfaces';

const flags: IBooleans = { read: true, write: false, delete: false };

const userFile: IValues = { user: 1, username: 'One', file: 'types.txt' };

const userContext: IStructure = {
  file: userFile,
  permissions: flags,
  counts: { views: 3, writes: 1 } // => INumbers (lint: try to remove IValues from IStructures)
};

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.