.d.ts없이 typescript의 외부 비 typescript 라이브러리를 어떻게 사용합니까?


100

내 .html 파일에서 정의했습니다.

<script type="text/javascript" src="bower_components/tree.js/tree.min.js"></script>
<script type="text/javascript" src="bower_components/q/q.js"></script>
<script type="text/javascript" src="test.js"></script>

그런 다음 test.js에서 :

 var myTree = Tree.tree({})

그러나 Typescript는 " 'Tree'라는 이름을 찾을 수 없습니다."라는 오류 메시지를 표시합니다.

또한 test.js 파일로 컴파일 하고 맨 위에 --module amd배치 하려고 시도했지만 import Tree = require("model/tree");다시 오류가 발생합니다. Cannot find external module 'model/tree'.그러나 분명히 유효한 가져 오기 여야합니다. 여기에서 정의 된 위치를 참조하십시오. https://github.com/marmelab/tree .js / blob / master / src / main.js

내가 사용 하려는 모든 외부 자바 스크립트 파일에 대해 .d.ts 파일을 작성하고 싶지 않습니다. 이것이 Typescript가 내가 원하는 일입니까?


1
당신은 필요가 없습니다 .d.ts 파일을 작성합니다. 참조 stackoverflow.com/questions/27273489/...을 예제
xmojmr

흥미롭지 만 여전히 객체를 선언해야합니다. Typescript가 javascript와 완전히 호환된다는 인상을 받았습니다. Typescript의 관점에서 볼 때 의미가 있다고 생각합니다. 어떻게 든 코드를 읽어야하며 참조가 잘 없으면 오류가 발생합니다.
Blub

답변:


124

내가 사용하려는 모든 외부 자바 스크립트 파일에 대해 .d.ts 파일을 작성하고 싶지는 않습니다. Typescript가 정말로 원하는 작업입니까?

아니오. 가장 간단하고 빠른 해결책은 단순히 변수가 있다는 것을 알려주는 것입니다 Tree. 이것은 다음과 같이 간단합니다.

declare var Tree:any; // Magic
var myTree = Tree.tree({})

TypeSafety는 TypeScript의 슬라이딩 스케일입니다. 이 경우에는 컴파일러에게 Tree당신이 관리 할 호출 이 있고 그것이 있다는 사실을 넘어서 많은 타입 안전성에 신경 쓰지 않는다는 것을 알리는 것입니다 .

IMHO : declare var Tree:any;코드에없는 변수의 사용을 선언하기 위해 작성하는 다른 JS 검증 도구보다 훨씬 간단한 구문입니다.

최신 정보

interface ITree {
    .. further methods and properties...
}

interface ITreeFactory {
    tree(input: { [key: string]: any }): Itree
};

declare var Tree: ITreeFactory; // magic...

이 방법을 사용했을 때 불만 스러웠습니다. Anton이 아래에 제시 한 방법을 사용해야했습니다. 마일리지는 다를 수 있습니다! 답변 basarat에 감사드립니다.
Tiz

더 나은 지능을 제공하는 인터페이스 대신 유형을 인터페이스로 지정할 수도 있습니다.
Akash Kava

24

'require'를 직접 정의하고 TypeScript의 문서화되지 않은 amd-dependency 기능을 사용할 수 있습니다.

/// <amd-dependency path="model/tree" />
declare var require:(moduleId:string) => any;
var Tree = require("model/tree");

'amd-dependency'지시문은 생성 된 코드에서 인수를 "정의"하기 위해 모듈을 포함하도록 컴파일러에 지시 합니다 . 여기에서 샘플을 참조하십시오 .

RequireJS와 함께 TypeScript를 사용하는 방법을 설명하는 아주 좋은 기사 를 확인할 수도 있습니다 .

그러나 기존 코드에 대한 적절한 TypeScript 정의를 작성하지 않으면 유형 정보가 제공되지 않으므로 유형 안전성 검사, 도구의 고급 코드 완성 등을 얻을 수 없습니다. 따라서 '트리'는 실제로 '모든'유형이 될 것이며 실제로는 다른 TS 코드 내의 동적 JS 조각이 될 것입니다.


웹팩을 사용하는 경우 큰되지 아이디어는 웹팩이 존재하는 동안의 transpiling로이 모듈이 필요합니다 ...
아카 쉬 카바
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.