e22m4u 2 лет назад
Родитель
Сommit
5b4f7815bb
3 измененных файлов с 59 добавлено и 17 удалено
  1. 9 2
      src/repository/repository-registry.d.ts
  2. 43 14
      src/repository/repository.d.ts
  3. 7 1
      src/types.d.ts

+ 9 - 2
src/repository/repository-registry.d.ts

@@ -1,6 +1,9 @@
+import {ModelId} from '../types';
+import {ModelData} from '../types';
 import {Service} from '@e22m4u/service';
 import {Repository} from './repository';
 import {Constructor} from '@e22m4u/service';
+import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME} from '../definition';
 
 /**
  * Repository registry.
@@ -11,12 +14,16 @@ export declare class RepositoryRegistry extends Service {
    *
    * @param ctor
    */
-  setRepositoryCtor(ctor: Constructor<Repository>): void;
+  setRepositoryCtor(ctor: Constructor<Repository<any, any, any>>): void;
 
   /**
    * Get repository.
    *
    * @param modelName
    */
-  getRepository(modelName: string): Repository;
+  getRepository<
+    Data extends ModelData = ModelData,
+    IdType extends ModelId = ModelId,
+    IdName extends string = DEFAULT_PRIMARY_KEY_PROPERTY_NAME,
+  >(modelName: string): Repository<Data, IdType, IdName>;
 }

+ 43 - 14
src/repository/repository.d.ts

@@ -2,14 +2,21 @@ import {Filter} from '../filter';
 import {ModelId} from '../types';
 import {Adapter} from '../adapter';
 import {ModelData} from '../types';
+import {PartialBy} from '../types';
 import {ItemFilter} from '../filter';
 import {WhereClause} from '../filter';
+import {Service} from '@e22m4u/service';
 import {ServiceContainer} from '@e22m4u/service';
+import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME} from '../definition';
 
 /**
  * Repository.
  */
-export declare class Repository {
+export declare class Repository<
+  Data extends ModelData = ModelData,
+  IdType extends ModelId = ModelId,
+  IdName extends string = DEFAULT_PRIMARY_KEY_PROPERTY_NAME,
+> extends Service {
   /**
    * Model name.
    */
@@ -39,7 +46,10 @@ export declare class Repository {
    * @param data
    * @param filter
    */
-  create(data: ModelData, filter?: ItemFilter): Promise<ModelData>;
+  create(
+    data: OptionalUnlessRequiredId<IdName, Data>,
+    filter?: ItemFilter,
+  ): Promise<ModelData>;
 
   /**
    * Replace by id.
@@ -49,10 +59,10 @@ export declare class Repository {
    * @param filter
    */
   replaceById(
-    id: ModelId,
-    data: ModelData,
+    id: IdType,
+    data: Omit<Data, IdName>,
     filter?: ItemFilter,
-  ): Promise<ModelData>;
+  ): Promise<Data>;
 
   /**
    * Replace or create.
@@ -60,7 +70,10 @@ export declare class Repository {
    * @param data
    * @param filter
    */
-  replaceOrCreate(data: ModelData, filter?: ItemFilter): Promise<ModelData>;
+  replaceOrCreate(
+    data: OptionalUnlessRequiredId<IdName, Data>,
+    filter?: ItemFilter,
+  ): Promise<Data>;
 
   /**
    * Patch by id.
@@ -70,24 +83,24 @@ export declare class Repository {
    * @param filter
    */
   patchById(
-    id: ModelId,
-    data: ModelData,
+    id: IdType,
+    data: PartialWithoutId<IdName, Data>,
     filter?: ItemFilter,
-  ): Promise<ModelData>;
+  ): Promise<Data>;
 
   /**
    * Find.
    *
    * @param filter
    */
-  find(filter?: Filter): Promise<ModelData[]>;
+  find(filter?: Filter): Promise<Data[]>;
 
   /**
    * Find one.
    *
    * @param filter
    */
-  findOne(filter?: ItemFilter): Promise<ModelData | undefined>;
+  findOne(filter?: ItemFilter): Promise<Data | undefined>;
 
   /**
    * Find by id.
@@ -95,7 +108,7 @@ export declare class Repository {
    * @param id
    * @param filter
    */
-  findById(id: ModelId, filter?: ItemFilter): Promise<ModelData>;
+  findById(id: IdType, filter?: ItemFilter): Promise<Data>;
 
   /**
    * Delete.
@@ -109,14 +122,14 @@ export declare class Repository {
    *
    * @param id
    */
-  deleteById(id: ModelId): Promise<boolean>;
+  deleteById(id: IdType): Promise<boolean>;
 
   /**
    * Exists.
    *
    * @param id
    */
-  exists(id: ModelId): Promise<boolean>;
+  exists(id: IdType): Promise<boolean>;
 
   /**
    * Count.
@@ -125,3 +138,19 @@ export declare class Repository {
    */
   count(where?: WhereClause): Promise<number>;
 }
+
+/**
+ * Makes fields as optional and remove id field.
+ */
+type PartialWithoutId<IdName extends string, Data> = Partial<
+  Omit<Data, IdName>
+>;
+
+/**
+ * Makes the given id field as optional.
+ */
+type OptionalUnlessRequiredId<IdName extends string, Data> = Data extends {
+  [K in IdName]: any;
+}
+  ? PartialBy<Data, IdName>
+  : Data;

+ 7 - 1
src/types.d.ts

@@ -1,10 +1,16 @@
 /**
- * Any object.
+ * Free-form object with open properties.
  */
 export declare type AnyObject = {
   [property: string]: unknown;
 };
 
+/**
+ * Makes specific field as optional.
+ */
+export declare type PartialBy<T, K extends keyof T> = Omit<T, K> &
+  Partial<Pick<T, K>>;
+
 /**
  * Model data.
  */