如何将ES6 require()语句移植到打字稿

时间:2018-11-21 18:20:52

标签: javascript typescript2.0 porting

我们已经能够将JS / ES6项目的所有代码移植到打字稿3.x,但似乎无法正确移植以下文件。

文件的简短版本如下:

index.js(原始):

export const Log = require('./src/Log');
export const OidcClient = require('./src/OidcClient');

export default {
    Log,
    OidcClient
};

index.ts(已移植):

import Log from './src/Log';
import { OidcClient } from './src/OidcClient';

export default {
    Log,
    OidcClient
};

问题似乎出在import LOG from './src/Log'export const Log = require('./src/Log');语句之间。如果我们将源文件更改为使用export LOG from './src/Log';,则Log在调用脚本文件中未定义,就像我们在移植版本中看到的问题一样。

对于源文件,Intellisense声明将导出的OidcClient语句定义为 (property) OidcClient: typeof import("c:/.../src/OidcClient").

OidcClient语句的移植版本定义为 (property) OidcClient: typeof OidcClient

我们如何通过TypeScript文件进行这项工作?

1 个答案:

答案 0 :(得分:0)

为了完整性

我们正在使用webpack,并使用以下输出设置将输出构建为库:

libraryTarget: 'var', library:'Oidc'

因此,JS客户端应使用类似Oidc.Log.Error(message)的模块。但是问题是Oidc.Log不确定。

线索

在浏览器的调试器中,我们注意到Oidc被定义为Module,这是我们所期望的,但是它具有一个名为default的神秘属性,其中包含我们想要的所有内容。好的,如何删除default属性并应用其部分对象Oidc模块中的所有内容?

经过4天的反复试验,我们找到了解决方案。

解决方案

文档以及我们可以找到的所有内容都表明我们应该使用:

export default { Log, OidcClient }

出于绝望,我们终于尝试删除default关键字,如下所示:

export { Log, OidcClient }

你猜怎么着?奏效了!

不再有神秘的default属性,所有类型都将按需使用Oidc模块!