【问题标题】:How to use declaration files in TypeScript如何在 TypeScript 中使用声明文件
【发布时间】:2012-10-25 11:23:39
【问题描述】:

当涉及到用纯 Javascript 编写的声明文件和 3rd 方库时,我在 TypeScript 中没有得到一些东西。假设我有以下 Javascript 类:

$ cat SomeClass.js

var SomeClass = (function () {
    function SomeClass() {
    }
    SomeClass.prototype.method1 = function () {
            return "some string";
    };
    return SomeClass;
})();
exports.SomeClass = SomeClass;

我想对其进行类型检查,所以我创建了这样的声明文件:

$ cat test.d.ts

class SomeClass {
    public method1(): string;
}

那我想在一些代码中使用类和声明文件:

$ cat main.ts

///<reference path="./test.d.ts"/>
import ns = module("./SomeClass");

function test(): string {
   var sc = new ns.SomeClass();
   return sc.method1();
}

当我尝试编译它时,我得到了这个:

$ tsc main.ts
main.ts(2,19): The name '"./SomeClass"' does not exist in the current scope
main.ts(2,19): A module cannot be aliased to a non-module type
main.ts(5,16): Expected var, class, interface, or module

据我所知,import 语句需要存在一个实际的 TypeScript 类,而引用语句不足以帮助编译器弄清楚如何处理它。

我试着改成

import ns = module("./test.d");

但也没有骰子。

我可以让它真正编译和运行的唯一方法是使用 require 语句而不是 import,像这样:

$ cat main.ts

///<reference path="./node.d.ts"/>
///<reference path="./test.d.ts"/>
var ns = require("./SomeClass");

function test(): string {
   var sc = new ns.SomeClass();
   return sc.method1();
}

这段代码的问题是 TypeScript 没有运行任何类型检查。其实我完全可以去掉这条线

///<reference path="./test.d.ts"/>

它不会改变任何东西。

但是,如果我删除 require 语句,我可以进行类型检查,但是代码在运行时会因为没有 require 语句而崩溃。

$ cat main.ts

///<reference path="./test.d.ts"/>

function test(): string {
   var sc = new SomeClass();
   return sc.method1();
}

test();

$ node main.js

main.js:2
    var sc = new SomeClass();
                 ^
ReferenceError: SomeClass is not defined
    ...

【问题讨论】:

    标签: javascript node.js typescript


    【解决方案1】:

    cat test.d.ts

    declare module "SomeClass.js" {
        class SomeClass {
            method1(): string;
        }
    }
    

    cat Main.ts

    ///<reference path="test.d.ts"/>
    import ns = module("SomeClass.js");
    
    function test() {
       var sc = new ns.SomeClass();
       return sc.method1();
    }
    

    tsc Main.ts --declarations

    cat Main.js

    var ns = require("SomeClass.js")
    function test() {
        var sc = new ns.SomeClass();
        return sc.method1();
    }
    

    cat Main.d.ts

    import ns = module ("SomeClass.js");
    function test(): string;
    

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2018-05-04
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多