【发布时间】:2019-04-16 20:29:50
【问题描述】:
我有一个旧的 JavaScript 库,我编写该库与 AMD 和 CommonJS 一起使用。我忘记了影响我以这种方式编写库的原始来源,但我的 JavaScript 库是按照以下模式编写的。
(function(window) {
'use strict';
function getLib() {
var mylib = {};
mylib.getSomething = function() {
return 'x';
}
mylib.getCar = function(make, model, year) {
return {
make: make,
model: model,
year: year
};
}
return mylib;
}
if(typeof module === 'object' && module && typeof module.exports === 'object') {
module.exports = getLib();
} else {
if(typeof(mylib) === 'undefined') {
window.mylib = getLib();
}
if(typeof define === 'function' && define.amd) {
define('mylib', [], getLib());
}
}
})(this);
如何为此 JavaScript 库编写类型定义 d.ts 文件?
我尝试如下写d.ts,但它不起作用。在我的 Angular 应用程序中,我输入了以下文件 node_modules/@types/mylib/index.d.ts。
interface Car {
make: string;
model: string;
year: number;
}
interface MyLib {
getSomething(): string;
getCar(make: string, model: string, year: number): Car;
}
declare module "mylib" {
export let mylib: MyLib
}
在我的控制器中,我只是尝试导入库并将其调试到控制台,但得到undefined。
import {mylib} from 'mylib'; //IDE doesn't complain, seems to find the type def
export class MyPage {
constructor() {
console.log(mylib); //undefined
console.log(mylib.getCar('ford', 'f150', 2018)); //code won't reach here
}
}
请注意,JavaScript 包 mylib 不在 NPM 上,而是一个私有存储库,我已经将它(例如 npm install mylib --save)安装到 node_modules/mylib。我提到这一点是因为我不确定类型 def 文件应该放在哪里。
感谢任何帮助。
更新:
根据以下建议,我已将 d.ts 文件修改为如下所示,并将其放入 mylib/index.d.ts。
declare module "mylib" {
let mylib: MyLib;
export = mylib;
}
现在,我可以通过两种方式导入库。第一种方式。
import mylib from 'mylib';
第二种方式。
import * as mylib from 'mylib';
在 IDE VS Code 中,没有任何抱怨(没有红线暗示问题)。此外,我将tsconfig.json 修改为如下所示。
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "commonjs",
"esModuleInterop": true,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2015.promise",
"es2017",
"dom"
]
}
}
当我运行ng build 时,我看到了下面的消息。
“有趣”的是,如果我注释掉 import 然后运行 ng build 或 ng serve,编译错误就会消失。当应用程序处于实时重新加载模式时,我可以简单地取消注释import,尽管出现编译错误,但我仍然可以在应用程序中使用库的所有功能。
【问题讨论】:
标签: javascript angular typescript typescript-typings