2017-08-16 121 views
4

我有一个像这样的存储库的通用接口。如何在Typescript中声明ES6模块的类型?

export interface IBaseRepository<T> { 
    create(model: T): T; 
    edit(model: T): T; 
    read(): T 
} 

我想在这样的功能模块(因为它基本上是一个无状态的单身人士)实现这个存储库接口。

// user-repository.ts 
export function create(model: IUser): IUser { ...code } 

export function edit(model: IUser): IUser { ...code } 

export function read(): IUser { ...code } 

有什么办法,以确保IBaseRepositoryUserRepository实现。或者,我是否必须始终将存储库实现为一个类并导出一个实例化的单例?

+0

这是什么都断言外部模块使用函数式编程? –

+0

@JaredSmith我可能不应该标记的东西,我不能完全肯定的:/ –

+0

悬停鼠标光标放在标签将弹出一个提示用什么样的标签是要帮你决定的说明。 –

回答

1

你可以捆绑所有功能集成到一个对象,并有出口。

事情是这样的:

import { IBaseRepository } from './master'; 
// user-repository.ts 
export function create(model: string): string { return ''; } 

export function edit(model: string): string { return ''; } 

export function read(): string { return ''; } 

export const repository: IBaseRepository<string> = { create, edit, read }; 

并使用它,就像您使用其他任何模块出口:

import { repository } from './repo'; 

repository.create('test'); 

或者使用出口默认导出功能直接如果你想要这种类型的默认模块导出。

import { IBaseRepository } from './master'; 
// user-repository.ts 
export function create(model: string): string { return ''; } 

export function edit(model: string): string { return ''; } 

export function read(): string { return ''; } 

export default { create, edit, read } as IBaseRepository<string>; 

,并导入模块分别获得它或导入功能:

import repo, { create } from './repo'; 

repo.create('test'); 

,您仍然可以导入各功能独立的过程。

注意根据您的示例使用类型我只是试图保持简单。

+0

感谢您的指导,我结束了使用'出口default'的选择,因为这似乎更紧密地代表了存储库的接口。代码现在看起来非常干净! 我只是希望有一个更好的方式来定义模块的公共接口(出口),并严格约束在打字稿实施。 –

+0

你可以这样做很容易地做到这一点,如果你要组中实现该接口的类的功能(就像在任何其他OOP语言)。但是,由于你坚持要把这些操作分开,所以你不能做很多事情。 – toskv

1

这个怎么样?

interface IFoo { 
    foo(): boolean; 
    bar(); 
} 

namespace Foo { 
    export function foo() { 
     return 42; 
    } 
} 

declare type assert<T, K extends T> = {}; 
declare const check1: assert<IFoo, typeof Foo>; 

我们得到一个不错的错误在CHECK1:

Type 'typeof Foo' does not satisfy the constraint 'IFoo'. 
    Types of property 'foo' are incompatible. 
    Type '() => number' is not assignable to type '() => boolean'. 
     Type 'number' is not assignable to type 'boolean'. 

我的例子有一个内嵌模块,但它应该是相似的使用import * as Foo from './foo';

+0

我刚刚试过你的方法,它感觉有点冗长,必须明确地对所有名称空间声明使用assert。但这是一个非常独特的问题,它似乎解决了定义严格的模块接口声明的问题。 –

相关问题