Saya memiliki antarmuka generik untuk repositori seperti ini.

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

Saya mencoba mengimplementasikan antarmuka repositori ini dalam modul fungsional seperti ini (karena pada dasarnya adalah lajang tanpa kewarganegaraan).

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

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

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

Apakah ada cara untuk memastikan bahwa IBaseRepository diimplementasikan di UserRepository. Atau apakah saya harus selalu mengimplementasikan repositori sebagai kelas dan mengekspor singleton yang dipakai?

5
Pulasthi Bandara 16 Agustus 2017, 15:17

2 jawaban

Jawaban Terbaik

Anda dapat menggabungkan semua fungsi ke dalam objek dan mengekspornya.

Sesuatu seperti ini:

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

Dan gunakan seperti Anda akan menggunakan hal lain yang diekspor modul:

import { repository } from './repo';

repository.create('test');

Atau gunakan ekspor default untuk mengekspor fungsi secara langsung jika Anda ingin memiliki jenis tersebut untuk ekspor modul default.

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

Dan impor modul untuk mendapatkannya atau impor fungsinya secara terpisah:

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

repo.create('test');

Anda masih dapat mengimpor setiap fungsi secara independen tentunya.

Catatan gunakan tipe sesuai dengan contoh Anda. Saya hanya mencoba menyederhanakannya.

2
toskv 16 Agustus 2017, 12:44

Bagaimana dengan ini?

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

Kami mendapatkan kesalahan yang bagus di 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'.

Contoh saya memiliki modul sebaris, tetapi harus serupa dengan menegaskan modul eksternal menggunakan import * as Foo from './foo';

1
Cristi Mihai 16 Agustus 2017, 19:46