typescript 交换机实现的条件导入

ki1q1bka  于 2023-02-25  发布在  TypeScript
关注(0)|答案(5)|浏览(212)

我有一个用TypeScript编写的node.js应用程序,我需要根据配置文件在两个接口实现之间切换。目前我有这段代码,看起来可以正常工作。

"use strict";

import { config } from "../config";

let Something;
if (config.useFakeSomething) {
    Something = require("./FakeSomething").FakeSomething;
} else {
    Something = require("./RealSomething").RealSomething;
}
...
let s = new Something();
s.DoStuff();
...

但是我有一种不好的直觉(主要是因为在加载模块时混合了requireimport)。有没有其他方法可以在不导入两个模块的情况下实现基于配置文件的切换?

ix0qys7i

ix0qys7i1#

如果你想让Something类的客户端代码保持干净,你可以把条件导入移到一个文件中。你可以为你的Something模块设置如下的目录结构:

/Something
    RealSomething.ts
    FakeSomething.ts
    index.ts

在您的index.ts中,可以包含以下内容:

import { config } from '../config';

const Something = config.useFakeSomething ?
    require('./FakeSomething').FakeSomething :
    require('./RealSomething').RealSomething;

export default Something;

在客户机代码中,您可以只导入Something

import Something from './Something/index';
rxztt3cl

rxztt3cl2#

我看不出你的方法有什么问题。事实上

import { config } from "../config";

当目标为commonjs时,将编译为以下javascript(ES6):

const config = require('../config');

因此它们实际上是相同的,您不会混合使用不同的模块加载技术。

z4bn682m

z4bn682m3#

你可以这样做:

let moduleLoader:any;

if( pladform == 1 ) {
    moduleLoader = require('./module1');
} else {
    moduleLoader = require('./module2');
}

然后

if( pladform === 1 ) {
    platformBrowserDynamic().bootstrapModule(moduleLoader.module1, [ languageService ]);
}
else if ( pladform === 2 ) {
    platformBrowserDynamic().bootstrapModule(moduleLoader.module2, [ languageService ]);
}
7gcisfzg

7gcisfzg4#

除了上面的正确答案之外,如果您需要对单个文件夹中的多个文件进行这种切换,您可以使用引用正确文件夹的符号链接(Windows上不可用),这样您的代码就可以保持干净。
例如,这种方法对于在真实的代码和存根之间切换很有好处

46qrfjad

46qrfjad5#

使用**import()**函数的现代答案是:

import { config } from "../config";

let Something;
if (config.useFakeSomething) {
    Something = (await import("./FakeSomething")).FakeSomething;
} else {
    Something = (await import("./RealSomething")).RealSomething;
}
...
let s = new Something();
s.DoStuff();
...

记住import()是非阻塞的,所以如果下面的代码需要import()的结果,就需要添加await

相关问题