Javascript 正确写入和导入自定义节点模块 编辑
这不是一个打字问题,而是一个最佳实践问题。TypeScript中的示例,但实际上,这里的问题是如何正确地公开组成模块的多个文件中的多个导出,以及如何正确地导入它们Javascript 正确写入和导入自定义节点模块 编辑,javascript,node.js,typescript,node-modules,Javascript,Node.js,Typescript,Node Modules,这不是一个打字问题,而是一个最佳实践问题。TypeScript中的示例,但实际上,这里的问题是如何正确地公开组成模块的多个文件中的多个导出,以及如何正确地导入它们 编辑2 还是有些不对劲 在Module2的索引中,我有: export * from "./queryFilter"; 在Module1 user.ts上,我使用 import { queryFilter as QueryFilter } from "Module2"; (...) var User = {...} User.ge
编辑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”
从这个方法来看,我做错了什么
我第一次写了两个节点模块,我确实有一些关于正确声明/使用它的问题
因此,我正在创建一个需要另一个自定义模块的模块,我们将它们称为Module1和Module2
因此,主应用程序需要模块1,但模块1也需要模块2
现在在模块2上,我有一堆文件,在每一个文件上,我导出我需要的东西。以下是一个示例:
模块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;
现在我的问题是,从模块2中的每个文件中导出单个项并以这种方式使用它是否足够?或者我应该有一个索引
,从Module2导出每个文件,以便Module1可以看到它们
大致如下:
模块2-index.ts:
export "./utils"
export "./queryFilter"
(...)
正确的做法是什么?我对这一点完全是新手,我读过的文件没有说明这一点
致以最诚挚的问候在您最后的评论之后,这是创建模块/库的“typescript解决方案”。解决方案与“纯”ES6类似;打字脚本只是增加了一小层难度
假设您编写了一个包含多个文件的模块/库:
功能1.ts
功能2.ts
创建index.ts,重新导出模块/lib中感兴趣的部分
export * from './func1'
export * from './func2'
....
显然,您可以选择(重新)导出并仅公开部分代码,例如从“/anotheFile”导出{thisFunc,thatClass}
使用声明
和commonjs
标志编译模块,并确保package.json
main
指向index.js
,而键入
入口指向生成的index.d.ts
现在可以使用ES6风格的导入语法从Javascript或Typescript使用此模块/库
import { func1, func2 } from 'mymodule'
如果这是Typescript,这两个函数的类型也将自动导入。在您最后的评论之后,这是创建模块/库的“Typescript解决方案”。解决方案与“纯”ES6类似;打字脚本只是增加了一小层难度 假设您编写了一个包含多个文件的模块/库: 功能1.ts 功能2.ts 创建index.ts,重新导出模块/lib中感兴趣的部分
export * from './func1'
export * from './func2'
....
显然,您可以选择(重新)导出并仅公开部分代码,例如从“/anotheFile”导出{thisFunc,thatClass}
使用声明
和commonjs
标志编译模块,并确保package.json
main
指向index.js
,而键入
入口指向生成的index.d.ts
现在可以使用ES6风格的导入语法从Javascript或Typescript使用此模块/库
import { func1, func2 } from 'mymodule'
如果这是Typescript,那么这两个函数的类型也将自动导入。@Darkrum感谢您的帮助回答,因为这确实是TS和JS之间差异最糟糕的例子之一。有人将不得不就此提出一个明确的指南。。。我现在没有时间,但你可以先检查一下(框架是你的模块2)和Tks@BrunoGrieder。这本身不是一个打字问题。它是用TypeScript编写的,但这里的问题是如何将多个文件中声明的大量导出公开到一个import/require调用中。请注意,除了您的
import=require
,您的export
语法实际上正是ES6中使用的语法。将import{QueryFilter}=require('Module2')。QueryFilter
改为import{QueryFilter as QueryFilter}从'Module2'
开始,您就有了ES6语法。@BrunoGrieder我做到了。我已经在重构了。我喜欢在将答案标记为已接受之前进行测试;)@Darkrum感谢您的帮助性回答,因为这确实是TS和JS之间差异的最糟糕的例子之一。有人必须就这一点提出明确的指南。。。我现在没有时间,但你可以先检查一下(框架是你的模块2)和Tks@BrunoGrieder。这本身不是一个打字问题。它是用TypeScript编写的,但这里的问题是如何将多个文件中声明的大量导出公开到一个import/require调用中。请注意,除了您的import=require
,您的export
语法实际上正是ES6中使用的语法。将import{QueryFilter}=require('Module2')。QueryFilter
改为import{QueryFilter as QueryFilter}从'Module2'
开始,您就有了ES6语法。@BrunoGrieder我做到了。我已经在重构了。我喜欢在将答案标记为已接受之前进行测试;)不知怎么的,这仍然不起作用。。我添加了第二个编辑,带有“流”和错误消息。该方法看起来还可以,但看起来应该