如何在TypeScript中使用声明文件

d51*_*512 8 javascript node.js typescript

当涉及声明文件和用纯Javascript编写的第三方库时,我在TypeScript中没有得到什么.假设我有以下Javascript类:

$ cat SomeClass.js

var SomeClass = (function () {
    function SomeClass() {
    }
    SomeClass.prototype.method1 = function () {
            return "some string";
    };
    return SomeClass;
})();
exports.SomeClass = SomeClass;
Run Code Online (Sandbox Code Playgroud)

我想得到它的类型检查,所以我创建这样的声明文件:

$ cat test.d.ts

class SomeClass {
    public method1(): string;
}
Run Code Online (Sandbox Code Playgroud)

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

$ cat main.ts

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

function test(): string {
   var sc = new ns.SomeClass();
   return sc.method1();
}
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

据我所知,import语句需要存在一个实际的TypeScript类,并且引用语句不足以帮助编译器找出如何处理它.

我试着改成它

import ns = module("./test.d");
Run Code Online (Sandbox Code Playgroud)

但也没有骰子.

实际编译和运行的唯一方法是使用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();
}
Run Code Online (Sandbox Code Playgroud)

此代码的问题是TypeScript没有运行任何类型检查.事实上,我可以完全删除该行

///<reference path="./test.d.ts"/>
Run Code Online (Sandbox Code Playgroud)

它不会改变任何东西.

但是,如果我删除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
    ...
Run Code Online (Sandbox Code Playgroud)

Mar*_*rot 7

cat test.d.ts

declare module "SomeClass.js" {
    class SomeClass {
        method1(): string;
    }
}
Run Code Online (Sandbox Code Playgroud)

猫主菜

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

function test() {
   var sc = new ns.SomeClass();
   return sc.method1();
}
Run Code Online (Sandbox Code Playgroud)

tsc Main.ts - 声明

猫Main.js

var ns = require("SomeClass.js")
function test() {
    var sc = new ns.SomeClass();
    return sc.method1();
}
Run Code Online (Sandbox Code Playgroud)

cat Main.d.ts

import ns = module ("SomeClass.js");
function test(): string;
Run Code Online (Sandbox Code Playgroud)