From 1446a811e2a891bd2a68c6b1aa26aa63404ebbf0 Mon Sep 17 00:00:00 2001 From: Long Tran Date: Sat, 3 Feb 2024 16:00:05 +1100 Subject: [PATCH] feat: strongly typed item methods --- packages/dynamoose/lib/General.ts | 12 +-- packages/dynamoose/lib/Item.ts | 8 ++ packages/dynamoose/lib/Model/index.ts | 90 +++++++++---------- packages/dynamoose/lib/ModelStore.ts | 6 +- packages/dynamoose/lib/Schema.ts | 6 +- packages/dynamoose/lib/Serializer.ts | 6 +- packages/dynamoose/lib/index.ts | 10 +-- .../lib/utils/dynamoose/returnModel.ts | 4 +- packages/dynamoose/test/types/Item.ts | 6 +- packages/dynamoose/test/types/Model.ts | 15 +++- packages/dynamoose/test/types/model/Query.ts | 8 +- packages/dynamoose/test/types/model/Scan.ts | 8 +- 12 files changed, 100 insertions(+), 79 deletions(-) diff --git a/packages/dynamoose/lib/General.ts b/packages/dynamoose/lib/General.ts index 2d27ae933..354dffa95 100644 --- a/packages/dynamoose/lib/General.ts +++ b/packages/dynamoose/lib/General.ts @@ -1,4 +1,4 @@ -import {Item} from "./Item"; +import {Item, ItemMethods} from "./Item"; import {Model} from "./Model"; // - General @@ -14,7 +14,9 @@ export type KeyObject = {[attribute: string]: string | number}; // An item representing a DynamoDB key export type InputKey = string | number | KeyObject; -interface ModelItemConstructor { +type Expand = {[KeyType in keyof T]: T[KeyType]} & {}; + +interface ModelItemConstructor { /** * In order to create a new item you just pass in your object into an instance of your model. * @@ -29,10 +31,10 @@ interface ModelItemConstructor { * // myUser is now an item instance of the User model * ``` */ - new (object: {[key: string]: any}): T; - Model: Model; + new (object: Expand>): T & U; + Model: Model; } -export type ModelType = T & Model & ModelItemConstructor; +export type ModelType = T & Model & ModelItemConstructor; // This represents an item array. This is used for the output of functions such as `scan`, `query`, and `batchGet`. These functions can extend this property to add additional properties or functions. However this represents the shared properties/functions for all item arrays. export interface ItemArray extends Array { diff --git a/packages/dynamoose/lib/Item.ts b/packages/dynamoose/lib/Item.ts index 4d5396411..5587939d4 100644 --- a/packages/dynamoose/lib/Item.ts +++ b/packages/dynamoose/lib/Item.ts @@ -30,6 +30,14 @@ export interface ItemSettings { type?: "fromDynamo" | "toDynamo"; } +export interface ItemMethods { + [key: string]: Function; +} + +export interface AnyItemMethods { + [key: string]: any; +} + interface ItemInternalProperties { originalObject: any; originalSettings: ItemSettings; diff --git a/packages/dynamoose/lib/Model/index.ts b/packages/dynamoose/lib/Model/index.ts index a0172c5aa..671f49da6 100644 --- a/packages/dynamoose/lib/Model/index.ts +++ b/packages/dynamoose/lib/Model/index.ts @@ -1,7 +1,7 @@ import CustomError from "../Error"; import ModelStore from "../ModelStore"; import {Schema, SchemaDefinition, DynamoDBSetTypeResult, ValueType, IndexItem, TableIndex} from "../Schema"; -import {Item as ItemCarrier, ItemSaveSettings, ItemSettings, ItemObjectFromSchemaSettings, AnyItem} from "../Item"; +import {Item as ItemCarrier, ItemSaveSettings, ItemSettings, ItemObjectFromSchemaSettings, AnyItem, ItemMethods, AnyItemMethods} from "../Item"; import utils from "../utils"; import ddb from "../aws/ddb/internal"; import Internal from "../Internal"; @@ -131,7 +131,7 @@ interface ModelInternalProperties { } // Model represents a single entity (ex. User, Movie, Video, Order) -export class Model extends InternalPropertiesClass { +export class Model extends InternalPropertiesClass { /** * This method is the basic entry point for creating a model in Dynamoose. When you call this method a new model is created, and it returns an item initializer that you can use to create instances of the given model. * @@ -153,14 +153,14 @@ export class Model extends InternalPropertiesCl * const Cat = dynamoose.model("Cat", new dynamoose.Schema({"name": String})); * ``` * - * An optional TypeScript class which extends `Item` can be provided right before the function bracket. This provides type checking when using operations like `Model.create()`. + * An optional TypeScript type which extends `Item` can be provided as a generic to `dynamoose.model`. This provides type checking when using operations like `Model.create()`. * * ```ts * import * as dynamoose from "dynamoose"; * import {Item} from "dynamoose/dist/Item"; * * // Strongly typed model - * class Cat extends Item { + * interface Cat extends Item { * id: number; * name: string; * } @@ -439,21 +439,21 @@ export class Model extends InternalPropertiesCl // latestTableDetails: DynamoDB.DescribeTableOutput; // pendingTaskPromise: () => Promise; Item: typeof ItemCarrier; - scan: (object?: ConditionInitializer) => Scan; - query: (object?: ConditionInitializer) => Query; + scan: (object?: ConditionInitializer) => Scan; + query: (object?: ConditionInitializer) => Query; methods: { item: { set: (name: string, fn: FunctionType) => void; delete: (name: string) => void }; set: (name: string, fn: FunctionType) => void; delete: (name: string) => void }; transaction: TransactionType; // Batch Get - batchGet (keys: InputKey[]): Promise>; - batchGet (keys: InputKey[], callback: CallbackType, any>): void; + batchGet (keys: InputKey[]): Promise>; + batchGet (keys: InputKey[], callback: CallbackType, any>): void; batchGet (keys: InputKey[], settings: ModelBatchGetSettings & {"return": "request"}): Promise; batchGet (keys: InputKey[], settings: ModelBatchGetSettings & {"return": "request"}, callback: CallbackType): void; - batchGet (keys: InputKey[], settings: ModelBatchGetSettings): Promise>; - batchGet (keys: InputKey[], settings: ModelBatchGetSettings, callback: CallbackType, any>): void; - batchGet (keys: InputKey[], settings: ModelBatchGetSettings & {"return": "items"}): Promise>; - batchGet (keys: InputKey[], settings: ModelBatchGetSettings & {"return": "items"}, callback: CallbackType, any>): void; - batchGet (keys: InputKey[], settings?: ModelBatchGetSettings | CallbackType, any> | CallbackType, callback?: CallbackType, any> | CallbackType): void | Promise | Promise> { + batchGet (keys: InputKey[], settings: ModelBatchGetSettings): Promise>; + batchGet (keys: InputKey[], settings: ModelBatchGetSettings, callback: CallbackType, any>): void; + batchGet (keys: InputKey[], settings: ModelBatchGetSettings & {"return": "items"}): Promise>; + batchGet (keys: InputKey[], settings: ModelBatchGetSettings & {"return": "items"}, callback: CallbackType, any>): void; + batchGet (keys: InputKey[], settings?: ModelBatchGetSettings | CallbackType, any> | CallbackType, callback?: CallbackType, any> | CallbackType): void | Promise | Promise> { if (typeof settings === "function") { callback = settings; settings = {"return": "items"}; @@ -528,9 +528,9 @@ export class Model extends InternalPropertiesCl const localCallback: CallbackType = callback as CallbackType; promise.then((response) => prepareResponse(response)).then((response) => localCallback(null, response)).catch((error) => localCallback(error)); } else { - return (async (): Promise> => { + return (async (): Promise> => { const response = await promise; - return prepareResponse(response) as Promise>; + return prepareResponse(response) as Promise>; })(); } } @@ -667,25 +667,25 @@ export class Model extends InternalPropertiesCl } // Update - update (obj: UpdatePartial): Promise; - update (obj: UpdatePartial, callback: CallbackType): void; - update (keyObj: InputKey, updateObj: UpdatePartial): Promise; - update (keyObj: InputKey, updateObj: UpdatePartial, callback: CallbackType): void; + update (obj: UpdatePartial): Promise; + update (obj: UpdatePartial, callback: CallbackType): void; + update (keyObj: InputKey, updateObj: UpdatePartial): Promise; + update (keyObj: InputKey, updateObj: UpdatePartial, callback: CallbackType): void; update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "request"}): Promise; update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "request"}, callback: CallbackType): void; - update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings): Promise; - update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings, callback: CallbackType): void; - update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "document"}): Promise; - update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "document"}, callback: CallbackType): void; - update (keyObj: ObjectType, updateObj: UpdatePartial): Promise; - update (keyObj: ObjectType, updateObj: UpdatePartial, callback: CallbackType): void; + update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings): Promise; + update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings, callback: CallbackType): void; + update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "document"}): Promise; + update (keyObj: InputKey, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "document"}, callback: CallbackType): void; + update (keyObj: ObjectType, updateObj: UpdatePartial): Promise; + update (keyObj: ObjectType, updateObj: UpdatePartial, callback: CallbackType): void; update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "request"}): Promise; update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "request"}, callback: CallbackType): void; - update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings): Promise; - update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings, callback: CallbackType): void; - update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "item"}): Promise; - update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "item"}, callback: CallbackType): void; - update (keyObj: InputKey | ObjectType, updateObj?: UpdatePartial | CallbackType | CallbackType, settings?: ModelUpdateSettings | CallbackType | CallbackType, callback?: CallbackType | CallbackType): void | Promise | Promise { + update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings): Promise; + update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings, callback: CallbackType): void; + update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "item"}): Promise; + update (keyObj: ObjectType, updateObj: UpdatePartial, settings: ModelUpdateSettings & {"return": "item"}, callback: CallbackType): void; + update (keyObj: InputKey | ObjectType, updateObj?: UpdatePartial | CallbackType | CallbackType, settings?: ModelUpdateSettings | CallbackType | CallbackType, callback?: CallbackType | CallbackType): void | Promise | Promise { if (typeof updateObj === "function") { callback = updateObj as CallbackType; // TODO: fix this, for some reason `updateObj` has a type of Function which is forcing us to type cast it updateObj = null; @@ -924,15 +924,15 @@ export class Model extends InternalPropertiesCl } // Create - create (item: Partial): Promise; - create (item: Partial, callback: CallbackType): void; + create (item: Partial): Promise; + create (item: Partial, callback: CallbackType): void; create (item: Partial, settings: ItemSaveSettings & {return: "request"}): Promise; create (item: Partial, settings: ItemSaveSettings & {return: "request"}, callback: CallbackType): void; - create (item: Partial, settings: ItemSaveSettings): Promise; - create (item: Partial, settings: ItemSaveSettings, callback: CallbackType): void; - create (item: Partial, settings: ItemSaveSettings & {return: "item"}): Promise; - create (item: Partial, settings: ItemSaveSettings & {return: "item"}, callback: CallbackType): void; - create (item: Partial, settings?: ItemSaveSettings | CallbackType | CallbackType, callback?: CallbackType | CallbackType): void | Promise | Promise { + create (item: Partial, settings: ItemSaveSettings): Promise; + create (item: Partial, settings: ItemSaveSettings, callback: CallbackType): void; + create (item: Partial, settings: ItemSaveSettings & {return: "item"}): Promise; + create (item: Partial, settings: ItemSaveSettings & {return: "item"}, callback: CallbackType): void; + create (item: Partial, settings?: ItemSaveSettings | CallbackType | CallbackType, callback?: CallbackType | CallbackType): void | Promise | Promise { if (typeof settings === "function" && !callback) { callback = settings; settings = {}; @@ -1004,15 +1004,15 @@ export class Model extends InternalPropertiesCl } // Get - get (key: InputKey): Promise; - get (key: InputKey, callback: CallbackType): void; + get (key: InputKey): Promise; + get (key: InputKey, callback: CallbackType): void; get (key: InputKey, settings: ModelGetSettings & {return: "request"}): Promise; get (key: InputKey, settings: ModelGetSettings & {return: "request"}, callback: CallbackType): void; - get (key: InputKey, settings: ModelGetSettings): Promise; - get (key: InputKey, settings: ModelGetSettings, callback: CallbackType): void; - get (key: InputKey, settings: ModelGetSettings & {return: "item"}): Promise; - get (key: InputKey, settings: ModelGetSettings & {return: "item"}, callback: CallbackType): void; - get (key: InputKey, settings?: ModelGetSettings | CallbackType | CallbackType, callback?: CallbackType | CallbackType): void | Promise | Promise { + get (key: InputKey, settings: ModelGetSettings): Promise; + get (key: InputKey, settings: ModelGetSettings, callback: CallbackType): void; + get (key: InputKey, settings: ModelGetSettings & {return: "item"}): Promise; + get (key: InputKey, settings: ModelGetSettings & {return: "item"}, callback: CallbackType): void; + get (key: InputKey, settings?: ModelGetSettings | CallbackType | CallbackType, callback?: CallbackType | CallbackType): void | Promise | Promise { if (typeof settings === "function") { callback = settings; settings = {"return": "item"}; @@ -1070,7 +1070,7 @@ export class Model extends InternalPropertiesCl } // Serialize Many - serializeMany (itemsArray: ModelType[] = [], nameOrOptions: SerializerOptions | string): any { + serializeMany (itemsArray: ModelType[] = [], nameOrOptions: SerializerOptions | string): any { return this.serializer.getInternalProperties(internalProperties).serializeMany(itemsArray, nameOrOptions); } } diff --git a/packages/dynamoose/lib/ModelStore.ts b/packages/dynamoose/lib/ModelStore.ts index bb4e1e736..9b71905c5 100644 --- a/packages/dynamoose/lib/ModelStore.ts +++ b/packages/dynamoose/lib/ModelStore.ts @@ -1,17 +1,17 @@ import CustomError from "./Error"; import {Model} from "./Model"; -import {Item} from "./Item"; +import {Item, ItemMethods} from "./Item"; import Internal from "./Internal"; const {internalProperties} = Internal.General; let models: {[name: string]: Model} = {}; -const returnObject = (input: Model | string): Model | never => { +const returnObject = (input: Model | string): Model | never => { if (input instanceof Model) { models[input.name] = input; return input; } else if (typeof input === "string") { - return models[input] as Model; + return models[input] as Model; } else { throw new CustomError.InvalidParameter("You must pass in a Model or model name as a string."); } diff --git a/packages/dynamoose/lib/Schema.ts b/packages/dynamoose/lib/Schema.ts index a3e843de5..3d4a56c56 100644 --- a/packages/dynamoose/lib/Schema.ts +++ b/packages/dynamoose/lib/Schema.ts @@ -1,7 +1,7 @@ import CustomError from "./Error"; import utils from "./utils"; import Internal from "./Internal"; -import {Item, ItemObjectFromSchemaSettings} from "./Item"; +import {AnyItemMethods, Item, ItemObjectFromSchemaSettings} from "./Item"; import {Model, ModelIndexes} from "./Model"; import * as DynamoDB from "@aws-sdk/client-dynamodb"; import {ModelType, ObjectType} from "./General"; @@ -273,7 +273,7 @@ const attributeTypes: (DynamoDBTypeResult | DynamoDBSetTypeResult)[] = utils.arr type GeneralValueType = string | boolean | number | Buffer | Date; export type ValueType = GeneralValueType | {[key: string]: ValueType} | ValueType[]; -type AttributeType = string | StringConstructor | BooleanConstructor | NumberConstructor | typeof Buffer | DateConstructor | ObjectConstructor | ArrayConstructor | SetConstructor | symbol | Schema | ModelType; +type AttributeType = string | StringConstructor | BooleanConstructor | NumberConstructor | typeof Buffer | DateConstructor | ObjectConstructor | ArrayConstructor | SetConstructor | symbol | Schema | ModelType; export interface TimestampObject { createdAt?: string | string[] | SchemaDefinition; @@ -324,7 +324,7 @@ interface IndexDefinition { } interface AttributeDefinitionTypeSettings { storage?: "milliseconds" | "seconds" | "iso"; - model?: ModelType; + model?: ModelType; attributes?: string[]; separator?: string; value?: string | boolean | number; diff --git a/packages/dynamoose/lib/Serializer.ts b/packages/dynamoose/lib/Serializer.ts index a915a4eb4..18165d0f6 100644 --- a/packages/dynamoose/lib/Serializer.ts +++ b/packages/dynamoose/lib/Serializer.ts @@ -1,5 +1,5 @@ import {ObjectType, ModelType} from "./General"; -import {Item} from "./Item"; +import {AnyItemMethods, Item} from "./Item"; import CustomError from "./Error"; import utils from "./utils"; import {InternalPropertiesClass} from "./InternalPropertiesClass"; @@ -16,7 +16,7 @@ interface SerializerInternalProperties { serializers: {[key: string]: SerializerOptions}; defaultSerializer?: string; - serializeMany: (itemsArray: ModelType[], nameOrOptions: SerializerOptions | string) => ObjectType[]; + serializeMany: (itemsArray: ModelType[], nameOrOptions: SerializerOptions | string) => ObjectType[]; serialize: (item: ObjectType, nameOrOptions: SerializerOptions | string) => ObjectType; } @@ -32,7 +32,7 @@ export class Serializer extends InternalPropertiesClass ({...original}) } }, - "serializeMany": (itemsArray: ModelType[], nameOrOptions: SerializerOptions | string): ObjectType[] => { + "serializeMany": (itemsArray: ModelType[], nameOrOptions: SerializerOptions | string): ObjectType[] => { if (!itemsArray || !Array.isArray(itemsArray)) { throw new CustomError.InvalidParameter("itemsArray must be an array of item objects"); } diff --git a/packages/dynamoose/lib/index.ts b/packages/dynamoose/lib/index.ts index 79d4916f5..5c0014ee3 100644 --- a/packages/dynamoose/lib/index.ts +++ b/packages/dynamoose/lib/index.ts @@ -3,7 +3,7 @@ import {Schema, SchemaDefinition} from "./Schema"; import {Condition} from "./Condition"; import transaction from "./Transaction"; import utils from "./utils"; -import {Item, AnyItem} from "./Item"; +import {Item, AnyItem, ItemMethods, AnyItemMethods} from "./Item"; import ModelStore from "./ModelStore"; import {ModelType} from "./General"; import CustomError from "./Error"; @@ -13,11 +13,11 @@ import {Instance} from "./Instance"; import {custom as TableDefaults} from "./Table/defaults"; import returnModel from "./utils/dynamoose/returnModel"; -const model = (name: string, schema?: Schema | SchemaDefinition | (Schema | SchemaDefinition)[], options?: ModelTableOptions): ModelType => { - let model: Model; - let storedSchema: Model; +const model = (name: string, schema?: Schema | SchemaDefinition | (Schema | SchemaDefinition)[], options?: ModelTableOptions): ModelType => { + let model: Model; + let storedSchema: Model; if (name) { - storedSchema = ModelStore(name); + storedSchema = ModelStore(name); } // TODO: this is something I'd like to do. But is a breaking change. Need to enable this and uncomment it in a breaking release. Also will need to fix the tests as well. /* if (schema && storedSchema) { diff --git a/packages/dynamoose/lib/utils/dynamoose/returnModel.ts b/packages/dynamoose/lib/utils/dynamoose/returnModel.ts index a4c9f5636..77613483e 100644 --- a/packages/dynamoose/lib/utils/dynamoose/returnModel.ts +++ b/packages/dynamoose/lib/utils/dynamoose/returnModel.ts @@ -1,9 +1,9 @@ import utils from ".."; import {ModelType} from "../../General"; -import {AnyItem, Item} from "../../Item"; +import {AnyItem, AnyItemMethods, Item, ItemMethods} from "../../Item"; import {Model} from "../../Model"; -export default (model: Model): ModelType => { +export default (model: Model): ModelType => { const returnObject: any = model.Item; const keys = utils.array_flatten([ Object.keys(model), diff --git a/packages/dynamoose/test/types/Item.ts b/packages/dynamoose/test/types/Item.ts index ec1953abb..0f8dfefa1 100644 --- a/packages/dynamoose/test/types/Item.ts +++ b/packages/dynamoose/test/types/Item.ts @@ -1,6 +1,6 @@ -import {User, UserTypedModel} from "./Model"; +import {UserTypedModel} from "./Model"; -const user = new User(UserTypedModel, {"id": "1", "name": "Jane", "age": 30}); +const user = new UserTypedModel({"id": "1", "name": "Jane", "age": 30}); const shouldPassSave = user.save(); const shouldPassSaveWithReturnRequest = user.save({"return": "request"}); @@ -11,3 +11,5 @@ const shouldPassSaveWithReturnItemCallback = user.save({"return": "item"}, () => // @ts-expect-error const shouldFailWithInvalidReturnType = user.save({"return": "invalid-return-type"}); + +const shouldPassCustomMethodAccess = user.resetPassword(); diff --git a/packages/dynamoose/test/types/Model.ts b/packages/dynamoose/test/types/Model.ts index c17536661..17099d799 100644 --- a/packages/dynamoose/test/types/Model.ts +++ b/packages/dynamoose/test/types/Model.ts @@ -1,7 +1,7 @@ /* eslint @typescript-eslint/no-unused-vars: 0 */ import * as dynamoose from "../../dist"; -import {Item} from "../../dist/Item"; +import {Item, ItemMethods} from "../../dist/Item"; import {IndexType} from "../../dist/Schema"; // @ts-expect-error @@ -73,11 +73,17 @@ const shouldFailWithInvalidUpdateTransaction = model.transaction.update(0); const shouldFailWithInvalidConditionTransaction = model.transaction.condition(0, []); // Typed Models -export class User extends Item { + +export interface UserMethods extends ItemMethods { + resetPassword: () => Promise; +} + +export interface UserItem extends Item { id: string; name: string; age: number; } + const userSchema = new dynamoose.Schema({ "id": String, "name": { @@ -89,7 +95,7 @@ const userSchema = new dynamoose.Schema({ "age": Number }); -export const UserTypedModel = dynamoose.model( +export const UserTypedModel = dynamoose.model( "User", userSchema ); @@ -110,3 +116,6 @@ UserTypedModel.update({"id": "foo"}, { UserTypedModel.update({"id": "foo"}, { "$REMOVE":{"age":null} }); + +// @ts-expect-error +const shouldFailItemCustomMethodAccess = UserTypedModel.resetPassword(); diff --git a/packages/dynamoose/test/types/model/Query.ts b/packages/dynamoose/test/types/model/Query.ts index b686e0fab..103afa29c 100644 --- a/packages/dynamoose/test/types/model/Query.ts +++ b/packages/dynamoose/test/types/model/Query.ts @@ -1,13 +1,13 @@ /* eslint @typescript-eslint/no-unused-vars: 0, no-console: 0 */ -import {UserTypedModel, UserModel, User} from "../Model"; +import {UserTypedModel, UserModel, User, UserMethods} from "../Model"; import {ObjectType, SortOrder} from "../../../dist/General"; import {Condition} from "../../../dist"; import {AnyItem} from "../../../dist/Item"; import {QueryResponse, Query} from "../../../dist/ItemRetriever"; // query.exec([callback]) -async function queryExec (): Promise { +async function queryExec (): Promise> { return await UserTypedModel.query().exec(); } async function queryExecUnTyped (): Promise { @@ -15,9 +15,9 @@ async function queryExecUnTyped (): Promise { } const queryExecUnTypedQueryResponse: Promise> = UserModel.query().exec(); -const queryExecTyped: Promise> = UserTypedModel.query("name").eq("Will").exec(); +const queryExecTyped: Promise> = UserTypedModel.query("name").eq("Will").exec(); -let isAssignableToQuery : Query; +let isAssignableToQuery : Query; // query.limit(count) isAssignableToQuery = UserTypedModel.query("name").eq("Will").limit(5); diff --git a/packages/dynamoose/test/types/model/Scan.ts b/packages/dynamoose/test/types/model/Scan.ts index b76dd836a..1d314c357 100644 --- a/packages/dynamoose/test/types/model/Scan.ts +++ b/packages/dynamoose/test/types/model/Scan.ts @@ -1,13 +1,13 @@ /* eslint @typescript-eslint/no-unused-vars: 0, no-console: 0 */ -import {UserTypedModel, User, UserModel} from "../Model"; +import {UserTypedModel, User, UserModel, UserMethods} from "../Model"; import {Condition} from "../../../dist"; import {AnyItem} from "../../../dist/Item"; import {ScanResponse, Scan} from "../../../dist/ItemRetriever"; import {ObjectType} from "../../../dist/General"; // scan.exec([callback]) -async function scanExec (): Promise { +async function scanExec (): Promise> { return await UserTypedModel.scan().exec(); } async function scanExecUnTyped (): Promise { @@ -15,11 +15,11 @@ async function scanExecUnTyped (): Promise { } const scanExecUnTypedWithScanResponse: Promise> = UserModel.scan().exec(); -const scanExecTyped: Promise> = UserTypedModel.scan("name").eq("Will").exec(); +const scanExecTyped: Promise> = UserTypedModel.scan("name").eq("Will").exec(); UserTypedModel.scan().exec(); -let isAssignableToScan : Scan; +let isAssignableToScan : Scan; // scan.limit(count) isAssignableToScan = UserTypedModel.scan().limit(5);