如何在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';