2017-08-16 125 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。但這是一個非常獨特的問題,它似乎解決了定義嚴格的模塊接口聲明的問題。 –

相關問題