Como importo outros arquivos TypeScript?


164

Ao usar o plug-in TypeScript para vs.net, como faço para declarar um módulo de importação de arquivo TypeScript em outros arquivos TypeScript?

arquivo 1:

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

arquivo 2:

//what goes here?

class bar extends moo.foo
{
}

Respostas:


202

Na versão 1.8 do TypeScript, você pode usar importinstruções simples , como no ES6:

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

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

Resposta antiga: No TypeScript versão 1.5, você pode usar tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Elimina completamente a necessidade de referenciar o estilo de comentário.

Resposta mais antiga:

Você precisa fazer referência ao arquivo na parte superior do arquivo atual.

Você pode fazer isso assim:

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

class Foo { }

etc.

Esses caminhos são relativos ao arquivo atual.

Seu exemplo:

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

class bar extends moo.foo
{
}

1
Isso funciona bem, no entanto, quando eu compilo o código para js. não há "require" ou qualquer tipo de link para os arquivos externos ... pelo que posso ver em outros exemplos, devo fazer um "import moo = module (" moo ")); no entanto, ele reclama que existe nenhum moo no escopo atual
Roger Johansson

2
Sim, referencenão gera nenhum código js que carrega esse js após a compilação. É apenas para o compilador. Não tenho experiência com TypeScript e AMD porque simplesmente agrupo os arquivos js gerados para que tudo que eu preciso esteja lá. Mas vejo o que você precisa e pode ler mais sobre isso aqui: typescriptlang.org/Content/… na página 75 (capítulo 9). Btw vale a pena ler toda a especificação, é relativamente curto em comparação com outros idiomas.
Peter Porfy

3
Você pode usar a --allbandeira com tsc no seu arquivo .ts principal. Os números do compilador todas as dependências com base em suas tags de referência e gera arquivo de uma única saída .js para o aplicativo inteiro:tsc --out app.js main.ts
nula

@PeterPorfy existe alguma maneira nós podemos digitar fortemente os links de referência usando T4MVC
Mark Macneil Bikeio

Observe que, se for solicitado ao TypeScript que gere es2015(ou esnext) módulos, a especificação da extensão do arquivo na importinstrução é obrigatória (a menos que você faça isso ). O TypeScript não adicionará a extensão para você. Além disso, no momento, ele não pode produzir .mjs, portanto essa extensão deve ser .js.
Dan Dascalescu

83

O Typecript distingue dois tipos diferentes de módulos: Módulos internos são usados ​​para estruturar seu código internamente. No tempo de compilação, você precisa colocar módulos internos no escopo usando caminhos de referência:

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

class bar extends moo.foo {
}

Por outro lado, módulos externos são usados ​​para referenciar arquivos de origem externos que devem ser carregados em tempo de execução usando CommonJS ou AMD . No seu caso, para usar o carregamento de módulo externo, você deve fazer o seguinte:

moo.ts

export class foo {
    test: number;
} 

app.ts

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

Observe a maneira diferente de colocar o código no escopo. Com módulos externos, você deve usar modulecom o nome do arquivo de origem que contém a definição de módulo. Se você quiser usar os módulos AMD, precisará chamar o compilador da seguinte maneira:

tsc --module amd app.ts

Isso então é compilado para

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
Sinto-me completamente perdido agora, não importa o que eu faça, o compilador gera um .js separado para cada arquivo .ts e não há código "necessário" em nenhum deles ... também "import moo = module (" moo " ); "dá um erro que o nome moo não existe no escopo atual, destacando a parte do módulo (" moo ")
Roger Johansson

Alguns pontos para esclarecer aqui: você está trabalhando no Visual Studio? Você tentou compilar o código que eu dei na resposta usando tsc diretamente? Você colocou os dois arquivos no mesmo diretório?
Valentin

1
sim, compilando a partir da linha de comando, os dois arquivos no mesmo diretório.
Roger Johansson

2
Eu bifurquei e enviei uma solicitação de recebimento. Por favor, deixe-me saber se isso funcionou.
Valentin

12
aperfeiçoar :) para outros lendo este: módulos precisa ser exportados também "módulo de exportação xxx"
Roger Johansson

20

Se você estiver usando módulos AMD, as outras respostas não funcionarão no TypeScript 1.0 (a mais nova no momento da redação).

Você tem diferentes abordagens disponíveis, dependendo de quantas coisas deseja exportar de cada .tsarquivo.

Exportações múltiplas

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

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

Exportação única

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

Eu gosto da abordagem acima e acho que o tsc.exe está gerando dependências corretas naquela chamada inicial para define (), que é GRANDE! O problema para mim é duas classes separadas, cada uma em seu próprio arquivo, cada uma envolvida em um módulo de exportação - eu posso fazer a "importação" e uma pode usar a outra, mas a classe A é herdada de B, ainda usando o TypeScript. de alguma forma?
Samuel Meacham

@SamuelMeacham, claro, não vejo por que não. Se ainda estiver com problemas, faça uma nova pergunta e conecte-a aqui. Vou dar uma olhada.
Desenhou Noakes

1
Isso me resolveu, tudo está super liso agora. Dependências, herança, tudo isso: stackoverflow.com/questions/21179144/…
Samuel Meacham

@SamuelMeacham você está se referindo a esta página ou ao link que você forneceu, porque esta resposta de Drew parece estar no local ...
Alexander Mills

Esta resposta está bastante desatualizada (2014). A sintaxe atual é descrita na seção Módulos do manual TypeScript.
Dan Dascalescu

18

Se você deseja usar módulos e deseja que ele seja compilado em um único arquivo JavaScript, faça o seguinte:

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()
        {
        }
    }
}

Você pode ler mais aqui: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

Eu evitaria usar agora, /// <reference path='moo.ts'/>mas para bibliotecas externas, onde o arquivo de definição não está incluído no pacote.

A reference pathsolução resolve erros no editor, mas isso realmente não significa que o arquivo precise ser importado. Portanto, se você estiver usando um fluxo de trabalho gulp ou JSPM, eles poderão tentar compilar separadamente cada arquivo em vez de tsc -outum arquivo.

Do Typecript 1.5

Basta prefixar o que você deseja exportar no nível do arquivo (escopo raiz)

aLib.ts

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

Você também pode adicionar posteriormente, no final do arquivo, o que deseja exportar

{
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
}

Ou até misture os dois juntos

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

Para a importação, você tem 2 opções, primeiro você escolhe novamente o que deseja (uma por uma)

anotherFile.ts

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

Ou as exportações inteiras

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

Nota sobre as exportações: exportar duas vezes o mesmo valor gerará um erro {export valueZero = 0; exportar {valueZero}; // valueZero já está exportado…}


Eu estava perdendo as chaves de todo o tipo importado, pelo que esta linha fixa-lo para mim:import {AClass} from "./aLib.ts";
Samuel Slade

8

Desde o TypeScript, 1.8+você pode usar uma importdeclaração simples e simples como:

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

ou a versão curinga:

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

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


caminho global é suportado ??
Vladimir Venegas

@VladimirVenegas Não tenho certeza se é exatamente o que você está procurando, mas dê uma olhada aqui: github.com/Microsoft/TypeScript/wiki/…
Szymon Dudziak

Para aqueles que estão começando o texto datilografado, esta é a melhor resposta. Para obter um exemplo completo, consulte: github.com/bitjson/typescript-starter
Jason Dreyzehner

3

usou uma referência como "///<reference path="web.ts" /> e, em seguida, nas propriedades do projeto do VS2013 para criar "app.ts", "Compilação de texto datilografado" -> "Combine a saída de javascript no arquivo:" (marcado) -> "app.js"



-1

Processo fácil e rápido no Visual Studio

Arraste e solte o arquivo com a extensão .ts da janela da solução para o editor, ele gerará um código de referência embutido como ..

/// <reference path="../../components/someclass.ts"/>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.