这是不一个TypeScript问题,而是一个最佳实践问题。 TypeScript中的示例,但实际上,这里的问题是如何正确地从组成模块的多个文件中公开多个导出,以及如何正确导入它们。
还有一些不对的事
所以,在我的Module2的索引中,我有这个:
root@server ~ $blkid
/dev/sda1: UUID="6c80b9ef-0228-4f6d-8ff9-7ed851f383f9" TYPE="ext2"
/dev/sda5: UUID="58e05f19-aa62-42cd-858b-568f415a0201" TYPE="swap"
/dev/sda6: UUID="8d7c0396-a3d3-4e72-847e-f8b3bbbda120" TYPE="ext4"
/dev/sda7: UUID="TmNPZO-V1Dq-xSRU-hHM2-02A8-9mJi-mRPLjo" TYPE="ext4"
/dev/sdb1: LABEL="/disk1" UUID="a19883ec-1fd0-472d-a2ef-188f943a0ab3" TYPE="ext4"
/dev/sdc1: LABEL="/disk2" UUID="c6bd0fc6-3d5c-4c29-9b33-a61b15793d5d" TYPE="ext4"
/dev/sdd1: LABEL="/disk3" UUID="5bda0575-1bfa-473b-83bc-519f705f2213" TYPE="ext4"
/dev/sde1: LABEL="/disk4" UUID="43fe460d-8ad4-41f9-b840-11f3d36d8788" TYPE="ext4"
/dev/sdf1: LABEL="/disk5" UUID="9b34ca0f-bc54-41fe-934a-daabdaa8521b" TYPE="ext4"
在Module1 user.ts上,我使用
导入它export * from "./queryFilter";
我的Module1的index.ts我将其导出为
import { queryFilter as QueryFilter } from "Module2";
(...)
var User = {...}
User.getById = (userId: string) => {
...
}
export { User }
然后,在我的主项目中,我使用
导入它export * from "./model/user";
但是,每次尝试调用User.getById时都会抛出错误:
import * as Schema from "Module1";
var User = Schema.User;
从这种方法来看,我做错了什么?
我有史以来第一次编写了几个节点模块,我确实对正确的声明/使用有一些疑问。
所以我正在创建一个需要另一个自定义模块的模块,我们称之为Module1和Module2。
因此,主应用程序需要Module1,但Module1也需要Module2。
现在在Module2上我有一堆文件,每一个我导出我需要的东西。这是一个示例:
Module2 - Utils.ts:
Debug: internal, implementation, error
TypeError: Uncaught error: Cannot read property 'getByEmail' of undefined
Module2 - queryFilter.ts:
"use strict"
const RandomString = require("randomstring");
let randomString = (numCharacters: number) => {
return RandomString.generate({
length: numCharacters,
capitalization: 'uppercase',
charset: 'alphanumeric'
});
}
module.exports.randomString = randomString;
在Module1上,我将Module2添加到"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 {
(...)
}
}
,所以当我想使用package.json
时,我需要这样:
Module1 - Class.ts:
QueryFilter
现在我的问题是,是否足以从Module2中的每个文件导出单个项目并以这种方式使用它?或者我应该有import { QueryFilter } = require("Module2").queryFilter;
从Module2导出每个文件,以便Module1可以看到它们?
有些事情:
Module2 - index.ts:
index
这样做的正确方法是什么?我对此非常感兴趣,而且我读过的文档并没有对此有所了解......
最好的问候
答案 0 :(得分:0)
根据您的上一次评论,这是'打字稿解决方案'用于创建模块/库。解决方案类似于"纯" ES6;打字稿中的打字只会增加一小部分难度。
假设你编写了一个包含多个文件的模块/库:
func1.ts
export func1(param1: number): string { ... }
func2.ts
export func2(): number { ....}
创建 index.ts ,重新导出模块/ lib的有趣部分
export * from './func1'
export * from './func2'
....
显然,您可以选择(重新)导出并公开部分代码,例如export { thisFunc, thatClass } from './anotheFile'
使用declarations
和commonjs
标记编译模块,并确保package.json
main
指向index.js
,typings
生成的index.d.ts
现在可以使用ES6样式导入语法从Javascript或Typescript中使用此模块/库
import { func1, func2 } from 'mymodule'
如果这是Typescript,那么2个函数的输入也将自动导入。