gpt4 book ai didi

javascript - 正确编写和导入自定义 Node 模块

转载 作者:行者123 更新时间:2023-11-28 05:34:17 24 4
gpt4 key购买 nike

编辑

不是一个 TypeScript 问题,而是一个最佳实践问题。 TypeScript 中的示例,但实际上,这里的问题是如何正确地公开组成模块的多个文件的多个导出,以及如何正确导入它们。

<小时/>

编辑2

还是有哪里不对

所以,在我的 Module2 索引中我有这个:

export * from "./queryFilter";

在 Module1 user.ts 上,我使用导入它

import { queryFilter as QueryFilter } from "Module2";
(...)
var User = {...}
User.getById = (userId: string) => {
...
}
export { User }

我的 Module1 的 index.ts 我将其导出为 从“./model/user”导出*;

然后,在我的主项目中,我使用导入它

import * as Schema from "Module1";
var User = Schema.User;

但是,每当我尝试调用 User.getById 时,都会引发错误:调试:内部、实现、错误
TypeError:未捕获错误:无法读取未定义的属性“getByEmail”

从这种方法来看,我做错了什么???

<小时/>

我第一次编写几个 Node 模块,我确实对正确声明/使用它有一些疑问。

因此,我正在创建一个需要另一个自定义模块的模块,我们将它们称为 Module1 和 Module2。

因此,主应用程序需要 Module1,但 Module1 也需要 Module2。

现在在 Module2 上我有一堆文件,并且在每个文件上我导出我需要的内容。这是一个示例:

模块2 - Utils.ts:

"use strict"
const RandomString = require("randomstring");

let randomString = (numCharacters: number) => {
return RandomString.generate({
length: numCharacters,
capitalization: 'uppercase',
charset: 'alphanumeric'
});
}

module.exports.randomString = randomString;

模块2 - queryFilter.ts:

"use strict"

export default class QueryFilter {
name: string;
op: string;
value: any;
scope: string;

constructor(name: string, op: string, value: any, scope: string) {
this.name = name;
this.op = op;
this.value = value;
this.scope = scope;
}

public static GetConditionQuery(filters: QueryFilter[], params: string[]) {
(...)
}

public static queryComparator(value1: any, value2: any, operator: string): any {
(...)
}
}

在 Module1 上,我将 Module2 添加到 package.json 中,因此当我想使用 QueryFilter 时,我需要这样:

模块1 - Class.ts:

import { QueryFilter } = require("Module2").queryFilter;

现在我的问题是,从 Module2 中的每个文件中导出单个项目并以这种方式使用它是否足够?或者我应该有一个 index 来从 Module2 导出每个文件,以便 Module1 可以看到它们?

大致如下:

模块2-index.ts:

export "./utils"
export "./queryFilter"
(...)

这样做的正确方法是什么?我对此完全是新手,我读过的文档对此没有任何说明。

最诚挚的问候

最佳答案

根据您的上一条评论,这是用于创建模块/库的“ typescript 解决方案”。 “纯”ES6 的解决方案类似; Typescript 中的打字只会增加一点难度。

假设您编写一个包含多个文件的模块/库:

func1.ts

export func1(param1: number): string { ... }

func2.ts

export func2(): number { ....}

创建一个index.ts,它重新导出模块/lib中有趣的部分

export * from './func1'
export * from './func2'
....

显然,您可以选择(重新)导出并仅公开部分代码,例如从“./anotheFile”导出 { thisFunc, thatClass }

使用 declarationscommonjs 标志编译模块,并确保 package.json main 点到 index.js,而 typings 条目指向生成的 index.d.ts

现在可以使用 ES6 样式导入语法从 Javascript 或 Typescript 使用此模块/库

import { func1, func2 } from 'mymodule'

如果这是 Typescript,这两个函数的类型也会自动导入。

关于javascript - 正确编写和导入自定义 Node 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com