我正计划编写一个用于分发的打字稿库,这将取决于cephes
。
为了在浏览器中使用Web程序集,我们必须像这样编译它:
const cephes = require('cephes'); // Browser
await cephes.compiled;
我不确定如何为包装cephes的Typescript库实现此方法。
例如,库将提供一个NormalDistribution,可以这样导入:
import { NormalDistrbution } from 'cephesdistributions';
如果我们摇摇欲坠,那么NormalDistribution可能是软件包中唯一包含的导入内容。因此,我们是否需要在await cephes.compiled
提供的所有模块中都包含cephesdistributions
?
答案 0 :(得分:1)
我认为您应该尽可能简单明了。由于您的消费者无法真正解决必须await
的问题,因此建议您将其留给await cephes.compiled
的消费者。
如果要捆绑cephes
,则可能要从库中重新导出cephes.compiled
,以便用户可以只使用您的库:
const cephes = require('cephes');
export const compiled = cephes.compiled;
export class NormalDistribution {
public mean: number;
public sd: number;
constructor(mean = 0, sd = 1) {
this.mean = mean;
this.sd = 1;
}
cdf(x: number): number {
// If this gets called before someone has `await`:ed `compiled`
// there will be trouble.
return cephes.ndtr(x);
}
}
这意味着您导出的类将立即具有其类型,即使它们调用得太早也会崩溃。由于您的使用者像您一样依赖cephes.compiled
的解决,因此您可以考虑在适当的时候存储编译状态和“保护”。例如,
const cephes = require('cephes');
let isCompiled = false;
export function assertIsCompiled() {
if (isCompiled) {
return;
}
throw new Error('You must wait for `cephesdistributions.compiled` to resolve');
}
export const compiled = cephes.compiled.then(() => { isCompiled = true });
export class NormalDistribution {
public mean: number;
public sd: number;
constructor(mean = 0, sd = 1) {
assertIsCompiled();
this.mean = mean;
this.sd = 1;
}
cdf(x: number): number {
return cephes.ndtr(x);
}
}