javascript - 如何在 TypeScript 中使用声明文件

标签 javascript node.js typescript

当涉及到用纯 Javascript 编写的声明文件和第 3 方库时,我在 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 类存在,而 reference 语句不足以帮助编译器确定如何处理它。

我试着把它改成

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

但也没有骰子。

我能让它实际编译和运行的唯一方法是使用 require 语句而不是导入,如下所示:

$ 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
    ...

最佳答案

猫测试.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;

关于javascript - 如何在 TypeScript 中使用声明文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235257/

相关文章:

javascript - 需要每秒调用脚本,还是更好的解决方案?

javascript - 更改页面以调用目标页面 javascript 文件中的方法

javascript - Firebase:执行 get 时获取奇怪的 `e` 对象

sql-server - 如何使用 Sequelize 调用 MSSQL 存储过程?

TypeScript:获取对象本身内部的对象键类型

javascript - 如何在 JavaScript 中单击 'EDIT' 按钮时使用特定数据预填充表单? (不使用任何数据库)

typescript - 如何在 typescript 中编写柯里化(Currying)函数的类型签名

javascript - 使用 jQuery 将 JSON 对象打印成 html

node.js - Sequelize - 计算关联并从与查询的关联中获取数据

jquery - 通过Ajax Jquery将JsonMessage添加到RabbitMQ