如何在Typescript中声明ES6模块的types?

我有一个像这样的存储库的通用接口。

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

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

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

有什么方法可以确保在IBaseRepository中实现UserRepository 。 或者我必须始终实施存储库作为一个类,并导出一个实例化的单身人士?

你可以将所有的函数绑定到一个对象中,并将其导出。

像这样的东西:

 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'); 

或者,如果您希望将此types用于默认模块导出,请使用导出默认值直接导出函数。

 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>; 

并导入模块获取或分别导入function:

 import repo, { create } from './repo'; repo.create('test'); 

您当然也可以独立导入每个function。

注意根据你的例子使用types我只是试图保持简单。

这个怎么样?

 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';使用import * as Foo from './foo';来声明一个外部模块import * as Foo from './foo';