我有一个像这样的存储库的通用接口。
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 }
有没有办法确保在IBaseRepository
中实施UserRepository
。或者我是否必须始终将存储库实现为类并导出实例化的单例?
答案 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');
您仍然可以独立导入每个功能。
注意根据您的示例使用类型我只是想让事情更简单。
答案 1 :(得分: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';