告诉TypeScript模块中存在实际创建的导出

时间:2018-04-12 09:52:03

标签: typescript typescript-typings

如果以编程方式创建导出:

示例:

const peeps = ['peep1', 'peep2', ...]
peeps.forEach(peep => exports[peep] = mainMethod.bind(null, peep))

告诉TypeScript这些方法的最佳方法是什么?目前,当我尝试按预期导入它们时,它们不会显示为导出。如何将它们定义为TypeScript理解的导出?

我正在尝试避免

export const peep1 = mainMethod.bind(null, 'peep1')
export const peep2 = mainMethod.bind(null, 'peep2')

修改 我可能需要说清楚。它工作正常,我没有导出本身的问题,我有一个问题,因为它们是实用的创建,vscode不知道它们存在,因为所述导出在设计时不在文件中。我试图让TypeScript在设计时识别出口。

2 个答案:

答案 0 :(得分:0)

问题的第一部分是构造一个具有在字符串数组中定义的属性的对象。

// The helper insures we get the type of peeps as ('peep1' | 'peep2')[] not string[]
const peeps = helper('peep1', 'peep2'); 
// Define a type that maps the constants to properties
let methods : {
    [P in typeof peeps[number]]: () => void
} = {} as any;
// Add the members to the object
peeps.forEach(peep => methods[peep] = mainMethod.bind(null, peep))

function helper<T extends string>(...array: T[]) : T[]{
    return  array;
} 

根据您的模块系统,您可以通过以下两种方式之一导出methods对象。

如果您使用amdcommonjsumd,则可以使用导出分配:

// methods.ts
// code above 
export = methods;

//usage.ts
import * as m from './aaa'
m.peep1();

对于其他模块系统,您可以使用默认导出:

// methods.ts
// code above 
export default methods;

//usage.ts
import m from './aaa'
m.peep1();

答案 1 :(得分:0)

我明白了。我想我只需添加:

declare export function peep1(age:number):any;
declare export function peep2(age:number):any;

基本上,我必须为它写一个d.ts文件,因为它们是动态创建的导出。