기존 JavaScript 라이브러리에서 .d.ts "typings"정의 파일을 어떻게 생성합니까?


193

내 자신과 타사 모두 많은 라이브러리를 사용하고 있습니다. "typings"디렉토리에 Jquery 및 WinRT 용 디렉토리가 포함되어 있습니다. 어떻게 작성합니까?

답변:


232

문제의 라이브러리, 작성 방법 및 원하는 정확도 수준에 따라 사용할 수있는 몇 가지 옵션이 있습니다. 옵션을 대략 내림차순으로 검토합니다.

어쩌면 이미 있을지도 모른다

항상 DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped )를 먼저 확인하십시오 . 이것은 문자 그대로 수천 개의 .d.ts 파일로 가득 찬 커뮤니티 저장소이며 사용중인 것이 이미있을 가능성이 큽니다. 또한 NPM에서 게시 한 .d.ts 파일의 검색 엔진 인 TypeSearch ( https://microsoft.github.io/TypeSearch/ ) 도 확인해야 합니다. 이것은 DefinitelyTyped보다 약간 더 많은 정의를 갖습니다. 일부 모듈은 NPM 배포의 일부로 자체 정의를 제공하므로 직접 작성하기 전에 해당 사례인지 확인하십시오.

어쩌면 당신은 필요하지 않을 수도 있습니다

TypeScript는 이제 --allowJs플래그를 지원하며 .js 파일에서 더 많은 JS 기반 추론을 만듭니다. 컴파일에 .js 파일을 포함시켜 --allowJs설정 과 함께 충분한 유형 정보를 제공하는지 확인할 수 있습니다. TypeScript는 이러한 파일에서 ES5 스타일 클래스 및 JSDoc 주석과 같은 것을 인식하지만 라이브러리가 이상한 방식으로 초기화되면 트립 될 수 있습니다.

시작하기 --allowJs

만약이 --allowJs당신에게 괜찮은 결과를주고 당신 자신, 당신은 결합 할 수 있습니다 더 나은 정의 파일 작성하려는 --allowJs--declaration라이브러리의 유형에 타이프의 "추측"을 참조하십시오. JSDoc 주석이 잘 작성되어 있고 컴파일러에서 주석을 찾을 수 있으면 수작업으로 작성한 파일만큼 좋을 수 있습니다.

dts-gen 시작하기

경우 --allowJs작동하지 않았다, 당신은 DTS-세대를 (사용 할 수 있습니다 https://github.com/Microsoft/dts-gen 시작 지점을 얻기 위해). 이 도구는 개체의 런타임 모양을 사용하여 사용 가능한 모든 속성을 정확하게 열거합니다. 긍정적 인 측면에서 이것은 매우 정확한 경향이 있지만 도구는 아직 추가 유형을 채우기 위해 JSDoc 주석 스크랩을 지원하지 않습니다. 당신은 이것을 이렇게 실행합니다 :

npm install -g dts-gen
dts-gen -m <your-module>

your-module.d.ts현재 폴더에 생성 됩니다.

다시 알림 버튼을 누르십시오

나중에 모두하고 싶지 않고 잠시 동안 유형을 사용하지 않으려면 TypeScript 2.0에서 이제 쓸 수 있습니다.

declare module "foo";

이는 당신에게 드릴 것입니다 유형의 모듈을 . 나중에 다룰 글로벌이 있다면 다음과 같이 작성하십시오.import"foo"any

declare const foo: any;

foo변수 를 줄 것 입니다.


25
그렇습니다. 그것은 많은 경우에 진입을위한 중요한 장벽이 될 것입니다. 형식 유추에 따라 최소한 "최상의 추측"을 출력 할 수있는 도구가 있으면 좋을 것입니다. 이것이 최적이지는 않지만 시간이 지남에 따라 조정될 수 있습니다.
Hotrodmonkey

7
+1-더 좋은 소식 : 파일과 파일을 --declarations모두 생성하므로 단일 컴파일 만 실행하면됩니다. .js.d.ts
Fenton

67
인기 라이브러리에 대한 고품질 정의 모음은 github.com/borisyankov/DefinitelyTyped
Boris Yankov

10
'최상의 추측'도구는 TypeScript에 이미 존재하는 IntelliSense보다 나을 것이 없습니다. 타입 정의의 장점은 컴파일러가 '추측'할 수있는 것보다 더 많은 정보를 제공한다는 것입니다.
Boris Yankov

12
--allowJs--declaration옵션 과 결합 할 수 없습니다 (TypeScript 1.8 및 2.0에서 테스트). 내가 시도하면, 나는 얻는다 :error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Alexey

53

tsc --declaration fileName.tsRyan이 설명 하는 것처럼 사용할 수도 있고 이미 프로젝트에 있다고 가정 할 때 declaration: true아래 compilerOptions에 지정할 수도 있습니다 .tsconfig.jsontsconfig.json


4
공유하려는 Angular 2 모듈을 개발하는 경우 이것이 가장 좋습니다.
Darcy

내가 선언 파일을 만들려고하는 유형에 tsc --declaration test.ts대한 오류가 발생 Cannot find name...하면 :) 유형을 선언하기 전에 유형이 필요합니까?
Kokodoko

2
@Kokodoko, 당신은 추가 시도 할 수 있습니다 declaration: true당신에 tsconfig.json파일을?
JayKan

감사합니다. * .ts에서 * .d.ts를 생성하고 싶었습니다.
vintproykt

16

이것을 처리하는 가장 좋은 방법은 (선언 파일이 DefinitelyTyped에서 사용할 수없는 경우 ) 전체 라이브러리가 아닌 사용하는 것에 대해서만 선언을 작성하는 것입니다. 이렇게하면 작업이 많이 줄어 듭니다. 또한 누락 된 메소드에 대해 불평함으로써 컴파일러가 도움을 줄 수 있습니다.


15

Ryan이 말했듯이 tsc 컴파일러에는 파일에서 파일 --declaration을 생성하는 스위치 .d.ts.ts있습니다. 또한 (버그 금지) TypeScript는 Javascript를 컴파일 할 수 있어야하므로 기존 Javascript 코드를 tsc 컴파일러에 전달할 수 있습니다.


1
현재 * .js 파일을 tsc에 전달하는 것으로 "파일 읽기 오류"angular-resource.js ": 파일을 찾을 수 없음"오류가 발생합니다. 따라서 tsc를 사용하려면 * .js 파일의 이름을 * .ts로 명시 적으로 바꿔야합니다. 자세한 내용은이 문제를 참조하십시오 - 나는 AngularJS와에서이를 사용하여 시도 : typescript.codeplex.com/workitem/26
제임스 스트라 칸

3
내가 알 수 있듯이 tsc는 유효한 JavaScript를 컴파일 할 수 있지만 유효한 TypeScript가 아닌 경우 (컴파일 경고가 표시됨) --declarations 플래그는 .d.ts 파일을 출력하지 않으므로 라이브러리가 TypeScript로 작성되지 않으면 여전히 선언 파일을 수동으로 작성해야합니다.
agradl


3

다음은 *.js최신 JavaScript 가 포함 된 여러 파일 을 포함하는 라이브러리 인 단일 TypeScript 정의 파일을 만드는 PowerShell입니다 .

먼저 모든 확장을로 변경하십시오 .ts.

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

둘째, TypeScript 컴파일러를 사용하여 정의 파일을 생성하십시오. 많은 컴파일러 오류가 발생하지만 무시할 수 있습니다.

Get-ChildItem | foreach { tsc $_.Name  }

마지막으로 모든 *.d.ts파일을 하나로 결합 index.d.ts하여 import명령문을 제거하고 default각 내보내기 명령문에서를 제거하십시오 .

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

이것은 index.d.ts많은 정의를 포함하는 사용 가능한 단일 파일로 끝납니다 .


2
두 번째 단계, Get-ChildItem | foreach {tsc --declaration $ _. Name}이 작동했습니다 (누락 된 --declaration param 추가됨)
Guru_07

2

Script # 또는 SharpKit을 지원하는 타사 JS 라이브러리의 기존 매핑을 찾고 싶습니다. 이 C #에서 .js 로의 크로스 컴파일러 사용자는 현재 직면 한 문제에 직면했을 것이며 타사 라이브러리를 스캔하고 기본 C # 클래스로 변환하는 오픈 소스 프로그램을 게시했을 수도 있습니다. 그렇다면 C # 대신 스캐너 프로그램을 해킹하여 TypeScript를 생성하십시오.

실패하면 타사 라이브러리의 C # 공용 인터페이스를 TypeScript 정의로 변환하는 것이 소스 JavaScript를 읽는 것보다 똑같을 수 있습니다.

내 관심은 Sencha의 ExtJS RIA 프레임 워크이며 Script # 또는 SharpKit에 대한 C # 해석을 생성하기 위해 프로젝트가 게시 된 것을 알고 있습니다.


참고 : Sencha / ExtJS에 대한 첫 번째 typescript 정의 파일을 만들었습니다 : github.com/andremussche/extjsTypescript/blob/master/jsondocs/…
André

안녕하세요 Camel Case, 나는 typescript와 함께 ExtJ
blorkfish

2

자신의 라이브러리를 만들 때 다음과 같이 (TypeScript Compiler) 명령 *.d.ts을 사용하여 파일을 만들 수 있습니다 tsc(라이브러리를 dist/lib폴더에 빌드한다고 가정 ).

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration) : *.d.ts파일을 생성 합니다
  • --declarationDir dist/lib: 생성 된 선언 파일의 출력 디렉토리.
  • --declarationMap: 각각의 해당 '.d.ts'파일에 대한 소스 맵을 생성합니다.
  • --emitDeclarationOnly: '.d.ts'선언 파일 만 내 보냅니다. (컴파일 된 JS 없음)

( 모든 명령 행 컴파일러 옵션에 대해서는 문서 를 참조하십시오 )

또는 당신의 예를 들면 package.json:

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

다음을 실행하십시오 : yarn build:types(또는 npm run build:types)


여전히 d.ts파일 을 생성하고 인터페이스를 사용 하는 방법을 알 수 없습니다 . 예가 있습니까?
Danosaure

위의 npm 스크립트는 *.d.ts파일 을 생성 하여 dist/lib폴더에 넣습니다 . tsconfig.json프로젝트 루트에 파일 이 필요 하지만 프로젝트가 작동하려면 파일이 있어야합니다.
magikMaker

일단 노출되면 사용할 수 없습니다. 다음 게시물 stackoverflow.com/questions/59742688 이 작동하도록 할 수 있습니까?
Danosaure
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.