当前位置: 首页 > 面试题库 >

如何使用打字稿编写节点模块?

黎苑博
2023-03-14
问题内容

因此,另一个问题(如何使用打字稿 导入 模块)的一般答案是:

1)创建blah.d.ts定义文件。

2)使用:

/// <reference path="./defs/foo/foo.d.ts"/>
import foo = require("foo");

至关重要的是,您需要 node_modules中的某个位置加载文件foo.d.ts和foo.html" target="_blank">js; 并且 NAME foo必须与两者 完全
匹配。现在…

我想回答的问题是如何 编写 一个可以以这种方式导入的打字稿模块?

可以说我有一个像这样的模块:

- xq/
- xq/defs/Q.d.ts
- xq/index.ts
- xq/base.ts
- xq/thing.ts

我想从base.ts中导出带有类’Base’的模块’xq’,从thing.ts中导出’Thing’的模块。

如果这是javascript中的节点模块,则我的index.ts看起来像:

var base = require('./base');
var thing = require('./thing');
module.exports = {
  Base: base.Base,
  Thing: thing.Thing
};

让我们尝试使用类似的打字稿文件:

import base = require('./base');
export module xq {
    export var base = base.Base;
}

调用它:

tsc base.ts index.ts things.ts ... --sourcemap --declaration --target ES3 
                                   --module commonjs --outDir dist/xq

怎么了?好吧,我们得到了base.d.ts:

export declare class Base<T> {
  ...
}

和无用的索引。d.ts:

export declare module xq {
    var Base: any; // No type hinting! Great. :(
}

完全无效的javascript,不会触发模块导入:

(function (xq) {
    xq.base = xq.base.Base;
})(exports.xq || (exports.xq = {}));
var xq = exports.xq;

我已经尝试了很多关于主题的变体,而我唯一可以使用的是:

declare var require;
var base = require('./base');
export module xq {
    export var base = base.Base;
}

…但这显然完全破坏了类型检查器。

所以。

Typescript很棒,但是这个模块的东西完全糟透了。

1)是否可以使用内置的定义生成器(我很怀疑)

2)您如何手工操作?我已经在.d.ts文件中看到了import语句,我认为这意味着有人已经找到了解决方法。这些工作如何?您如何为其中带有导入语句的声明的模块编写打字稿?

(例如,我怀疑执行模块声明的正确方法是:

/// <reference path="base.d.ts" />
declare module "xq" {
  import base = require('./base'); 
  module xq {
    // Some how export the symbol base.Base as Base here
  }
  export = xq;
}

…但我不知道要输入的打字稿是什么)。


问题答案:

对于JavaScript:

var base = require('./base');
var thing = require('./thing');
module.exports = {
  Base: base.Base,
  Thing: thing.Thing
};

打字稿

import base = require('./base');
import thing = require('./thing');
var toExport = {
  Base: base.Base,
  Thing: thing.Thing
};
export = toExport;

甚至这个打字稿:

import base = require('./base');
import thing = require('./thing');
export var Base = base.Base;
export var Thing = thing.Thin;


 类似资料:
  • 问题内容: 我正在尝试打字稿。在hello世界阶段它工作正常。我现在正在尝试使用npm模块: = 这不起作用: -> -> 看着打字稿文档和谷歌没有帮助。其他S /O问题未得到回答 元素: 打字稿1.8最新 是的,lodash已安装并存在于我的文件系统中(已选中) 我也做了 变种或不起作用 我试图调整tsconfig.json选择在其他的答案建议 ,并在一些答案建议,仍然无法正常工作 我们如何在打

  • 在控制台中,当运行时,命令现在被本机启用(node版本 但是,当我添加打字稿层时,我总是得到。 我如何解决这个问题? 背景思想:本机使用获取并摆脱和依赖项 < code>tsconfig.json和一般设置:https://github . com/NEX ys-system/server-boilerplate/blob/master/ts config . JSON 另见: Fetch API

  • 我已经在我的.html文件中定义了这些: 然后在test.js: 但Typescript错误地指出:“找不到名称‘树’” 我也尝试编译与和放置在test.js文件的顶部,但它再次出错:

  • 问题内容: 如果要使用节点8编译源代码,建议为打字稿配置什么? 大多数教程使用以下 tsconig.json : 但是现在我发现,并非所有可用功能都受支持。例如,抛出错误: 类型’string []’不存在属性’includes’。 我发现了一个问题,即解决了这个问题。解决方法是使用lib 。我可以覆盖默认库: 但是我不确定这是否是节点8的最佳配置-该库不支持更多功能吗?是否定义了很多功能? 所以

  • 我是打字稿的新手。现在我正在学习课程并得到一些问题: 当我们扩展父类时,我们必须使用super()。但是,如果我想省略父构造函数,我们可以这样做或覆盖它吗? [日志]:"不要显示" [日志]:“我的名字是派生的”

  • 我正在努力寻找 有什么不同?