다른 TypeScript 파일을 가져 오려면 어떻게합니까?


164

vs.net 용 TypeScript 플러그인을 사용할 때 하나의 TypeScript 파일을 다른 TypeScript 파일에 선언 된 모듈을 가져 오려면 어떻게해야합니까?

파일 1 :

module moo
{
    export class foo .....
}

파일 2 :

//what goes here?

class bar extends moo.foo
{
}

답변:


203

TypeScript 버전 1.8부터는 importES6에서와 같이 간단한 명령문을 사용할 수 있습니다 .

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

https://www.typescriptlang.org/docs/handbook/modules.html

이전 답변 : TypeScript 버전 1.5에서 다음을 사용할 수 있습니다 tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

주석 스타일 참조가 필요하지 않습니다.

더 오래된 답변 :

현재 파일의 맨 위에있는 파일을 참조해야합니다.

다음과 같이 할 수 있습니다 :

/// <reference path="../typings/jquery.d.ts"/>
/// <reference path="components/someclass.ts"/>

class Foo { }

기타

이 경로는 현재 파일을 기준으로합니다.

귀하의 예 :

/// <reference path="moo.ts"/>

class bar extends moo.foo
{
}

1
그러나 코드를 js로 컴파일하면 정상적으로 작동합니다. "필수"또는 외부 파일에 대한 링크가 없습니다. 다른 예제에서 볼 수 있듯이 "import moo = module ("moo ")을 수행해야합니다. 현재 범위에서 더 무 없습니다
— 로저 요한슨

2
예, reference컴파일 후 js를로드하는 js 코드를 생성하지 않습니다. 컴파일러 전용입니다. 생성 된 js 파일을 번들로 묶어 필요한 모든 것이 있기 때문에 TypeScript 및 AMD에 대한 경험이 없습니다. 그러나 필요한 것이 무엇인지 알 수 있습니다. 75 페이지의 typescriptlang.org/Content/… (9 장). 전체 사양을 읽을 가치가 있지만 다른 언어에 비해 비교적 짧습니다.
— 피터 포피

3
--all기본 .ts 파일에서 tsc와 함께 플래그를 사용할 수 있습니다 . 컴파일러는 참조 태그를 기반으로 모든 종속성을 파악하고 전체 응용 프로그램에 대해 단일 출력 .js 파일을 생성합니다.tsc --out app.js main.ts
— null

@PeterPorfy는 T4MVC를 사용하여 참조 링크를 강력하게 입력 할 수있는 방법이 있습니까
— Mark Macneil Bikeio

타이프 라이터가 생성하라고하면합니다 es2015(또는 esnext에서 파일 확장자 지정) 모듈을 import문입니다 필수 (당신이하지 않는 한 이 ). TypeScript는 확장명을 추가하지 않습니다. 또한 현재는 출력 할 수 없으므로 .mjs확장자는이어야 .js합니다.
— Dan Dascalescu

83

Typescript는 두 가지 종류의 모듈을 구별합니다. 내부 모듈은 코드를 내부적으로 구성하는 데 사용됩니다. 컴파일 타임에 참조 경로를 사용하여 내부 모듈을 범위 내로 가져와야합니다.

/// <reference path='moo.ts'/>

class bar extends moo.foo {
}

한편, 외부 모듈은 CommonJS 또는 AMD를 사용하여 런타임에 로드 될 외부 소스 파일을 참조하는 데 사용됩니다 . 귀하의 경우 외부 모듈 로딩을 사용하려면 다음을 수행해야합니다.

moo.ts

export class foo {
    test: number;
} 

app.ts

import moo = module('moo');
class bar extends moo.foo {
  test2: number;
}

코드를 범위로 묶는 다른 방법에 유의하십시오. 외부 모듈의 module경우 모듈 정의가 포함 된 소스 파일의 이름과 함께 사용해야 합니다. AMD 모듈을 사용하려면 다음과 같이 컴파일러를 호출해야합니다.

tsc --module amd app.ts

그런 다음 컴파일됩니다

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
}
define(["require", "exports", 'moo'], function(require, exports, __moo__) {
    var moo = __moo__;

    var bar = (function (_super) {
        __extends(bar, _super);
        function bar() {
            _super.apply(this, arguments);

        }
        return bar;
    })(moo.foo);
})    

7
내가 무엇을하든 컴파일러는 각 .ts 파일에 대해 별도의 .js를 생성하며 둘 중 하나에 "필수"코드가 없습니다 ... 또한 "import moo = module ("moo " ); "모듈 ("moo ") 부분을 강조 표시하여 moo라는 이름이 현재 범위에 존재하지 않는다는 오류를 표시합니다.
— Roger Johansson

몇 가지 요점을 명확하게 설명하십시오. Visual Studio에서 작업하고 있습니까? tsc를 사용하여 답변에 준 코드를 직접 컴파일하려고 했습니까? 두 파일을 같은 디렉토리에 두었습니까?
— Valentin

1
예, 동일한 디렉토리에있는 두 파일을 commandline에서 컴파일합니다.
— Roger Johansson

2
나는 갈아 입고 당신에게 풀 요청을 보냈습니다. 작동하는지 알려주세요.
— Valentin

12
다른 사람이이 글을 읽고에 대한 :) 완벽 : 모듈의 요구도 내보낼 "수출 모듈 XXX"
— 로저 요한슨

20

AMD 모듈을 사용하는 경우 다른 답변은 TypeScript 1.0 (작성 당시 최신)에서 작동하지 않습니다.

각 .ts파일 에서 내보내려는 항목 수에 따라 다양한 방법을 사용할 수 있습니다 .

여러 수출

푸츠

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

var foo1 = new fooModule.Foo();
var foo2: fooModule.IFoo = {};

단일 수출

푸츠

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

위의 접근법을 좋아하고 tsc.exe가 define ()에 대한 초기 호출에서 올바른 종속성을 생성한다는 것을 알았습니다. 나에게 대한 문제는 각각 자체 파일에 있고 각각 내보내기 모듈에 싸여있는 2 개의 개별 클래스입니다. "가져 오기"를 수행 할 수 있고 하나는 다른 것을 사용할 수 있지만 클래스 A는 B에서 상속 할 수 있습니다. 어쩐지?
— Samuel Meacham

@SamuelMeacham, 확실하지 않습니다. 왜 그런지 모르겠습니다. 여전히 문제가 발생하면 새로운 질문을하고 여기에 연결하십시오. 내가 볼게
— Drew Noakes

1
이것은 나를 분류했습니다. 모든 것이 매우 부드럽습니다. 종속성, 상속, 그것의 모든 : stackoverflow.com/questions/21179144/...
— 사무엘 Meacham

드류에서이 대답은 ...에 자리 것 때문에 @SamuelMeacham 당신은이 페이지 또는 제공된 링크를 참조하는
— 알렉산더 밀스

이 답변은 상당히 구식입니다 (2014). 현재 구문은 TypeScript 핸드북 의 모듈 섹션에 설명되어 있습니다.
— Dan Dascalescu

18

모듈을 사용하고 단일 JavaScript 파일로 컴파일하려면 다음을 수행하십시오.

tsc -out _compiled/main.js Main.ts

Main.ts

///<reference path='AnotherNamespace/ClassOne.ts'/>
///<reference path='AnotherNamespace/ClassTwo.ts'/>

module MyNamespace
{
    import ClassOne = AnotherNamespace.ClassOne;
    import ClassTwo = AnotherNamespace.ClassTwo;

    export class Main
    {
        private _classOne:ClassOne;
        private _classTwo:ClassTwo;

        constructor()
        {
            this._classOne = new ClassOne();
            this._classTwo = new ClassTwo();
        }
    }
}

ClassOne.ts

///<reference path='CommonComponent.ts'/>

module AnotherNamespace
{
    export class ClassOne
    {
        private _component:CommonComponent;

        constructor()
        {
            this._component = new CommonComponent();
        }
    }
}

CommonComponent.ts

module AnotherNamespace
{
    export class CommonComponent
    {
        constructor()
        {
        }
    }
}

자세한 내용은 여기를 참조하십시오 : http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

지금은 사용하지 않는 것이 /// <reference path='moo.ts'/>정의 파일이 패키지에 포함되지 않은 외부 라이브러리를하지만.

reference path로 해결할 수있는 문제의 편집기에 오류가 있지만, 정말 파일의 요구를 의미하지 않습니다 가져올 수 있습니다. 따라서 gulp 워크 플로 또는 JSPM을 사용하는 경우 tsc -out하나의 파일 대신 각 파일을 개별적으로 컴파일하려고 시도 할 수 있습니다 .

Typescript 1.5에서

파일 수준에서 내보낼 항목을 접두사로 붙이기 만하면됩니다 (루트 범위).

aLib.ts

{
export class AClass(){} // exported i.e. will be available for import
export valueZero = 0; // will be available for import
}

내보낼 파일 끝에 나중에 내보낼 항목을 추가 할 수도 있습니다

{
class AClass(){} // not exported yet
valueZero = 0; // not exported yet
valueOne = 1; // not exported (and will not in this example)

export {AClass, valueZero} // pick the one you want to export
}

아니면 둘 다 섞어도

{
class AClass(){} // not exported yet
export valueZero = 0; // will be available for import
export {AClass} // add AClass to the export list
}

가져 오기에는 두 가지 옵션이 있습니다. 먼저 원하는 것을 다시 선택하십시오 (하나씩)

anotherFile.ts

{
import {AClass} from "./aLib.ts"; // you import only AClass
var test = new AClass();
}

아니면 전체 수출

{
import * as lib from "./aLib.ts"; // you import all the exported values within a "lib" object
var test = new lib.AClass();
}

수출 관련 참고 사항 : 동일한 값을 두 번 내 보내면 오류가 발생합니다. {export valueZero = 0; 수출 {valueZero}; // valueZero가 이미 내보내졌습니다…}


가져온 유형 주위에 중괄호가 누락되었으므로이 줄로 수정했습니다.import {AClass} from "./aLib.ts";
— Samuel Slade

8

TypeScript부터 다음 과 같은 1.8+간단한 간단한 import문장을 사용할 수 있습니다 .

import { ClassName } from '../relative/path/to/file';

또는 와일드 카드 버전 :

import * as YourName from 'global-or-relative';

더 읽기 : https://www.typescriptlang.org/docs/handbook/modules.html


글로벌 경로가 지원됩니까 ??
— Vladimir Venegas

@VladimirVenegas 확실하지 않다는 것이 확실하지만 여기를 살펴보십시오. github.com/Microsoft/TypeScript/wiki/…
— Szymon Dudziak

방금 Typescript에 들어가는 사람들에게 이것이 가장 좋은 대답입니다. 전체 예를 들어, 참조 : github.com/bitjson/typescript-starter
— 제이슨 Dreyzehner

3

"///<reference path="web.ts" /> "app.ts", "Typescript Build"-> "자바 스크립트 출력을 파일로 결합하기 위해 VS2013 프로젝트 속성에서 참조를 사용한 후 다음 과 같이 참조를 사용했습니다 :"(checked)-> "app.js"



-1

Visual Studio의 빠른 프로세스

.ts 확장자를 가진 파일을 솔루션 창에서 편집기로 끌어다 놓으면 다음과 같은 인라인 참조 코드가 생성됩니다.

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