2017-10-28 65 views
0

我有在一个文件夹的一个项目,每一个模块应该有一个特定的接口:声明当前模块为具有特定接口

project/ 
    modules/ 
    A/index.ts 
    B/index.ts 
    C/index.ts 

每个index.ts文件,应该坚持一定的界面。 事情是这样的:

export const foo = ... 
export const bar = ... 

我怎么能宣称每个index.ts文件必须导出某个接口? 换句话说,我需要告诉TypeScript,对于这些index.ts文件中的每一个,module.exports都必须遵守某个接口。

我在Github上提交的问题,这与打字稿/ DefinitelyTyped:https://github.com/Microsoft/TypeScript/issues/19554

+0

也许我应该使用模块或命名空间?一直避免,直到现在或许... –

+0

*建立他们一个监狱!* – naomik

+0

是的,但如何大声笑感谢:) –

回答

1

一般来说,指定模块必须实现目前尚不支持的类型,但如您在GitHub的建议,你可以使用一个约定您从中链接的问题。

嗯,它实际上可以处理导出表单,但是您使用的是无效的导出语法(export {} as MyInterface),无论类型是否存在。

一种方式来写,这将是

export interface MyInterface { 
    id: number; 
    name:string 
} 

const m: MyInterface = { 
    id: 1 
} 

export = m; 

我们可能会认为它更简洁的

export = {id: 1} as MyInterface; 

这是有效的语法,但作为一个类型断言写的,而不是执行的要求,这样

export = {} as MyInterface; 

typechecks以及。这使得第一种形式更可取。

+0

谢谢,我会尝试一些你的建议,似乎现在已经足够了......你最后提到'export = {}是否为MyInterface;'工作?我尽量避免覆盖'module.exports'。 –

+0

我认为使用'export default {}作为MyInterface'会更好,不是吗?然后将所有内容附加到默认值。或者像默认的其他属性。 –

+0

是的,我宁愿强烈倾向'default',但是你想要_type_模块对象本身,这是最接近你可以得到,因为'default'只是一个带有语法糖的命名导出来导入它。它将使用默认值。然而,'as type'不起作用,因为它是一个类型断言而不是一个类型注释。这例如允许缺少属性。 –