Skip to content

Commit

Permalink
Merge pull request #4 from maxfi/fix/type
Browse files Browse the repository at this point in the history
Disable parameter inference
  • Loading branch information
surmon-china authored Mar 9, 2022
2 parents 65e7ec1 + a66555b commit f9e7ae8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 22 deletions.
32 changes: 20 additions & 12 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import _axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
import type { Filter, Projection, Sort, UpdateFilter, Document } from 'mongodb'

type AnyKeys<T> = { [P in keyof T]?: T[P] | any }
type NoInfer<A extends any> = [A][A extends any ? 0 : never]
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never }
type XOR<T, U> = T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U

Expand Down Expand Up @@ -157,7 +158,10 @@ export class MongoDBDataAPI<InnerDoc = any> {
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#find-a-single-document
*/
public findOne<D = InnerDoc>(
params?: ExtendBaseParams<{ filter?: Filter<D>; projection?: Projection<D> }>
params?: ExtendBaseParams<{
filter?: Filter<NoInfer<D>>
projection?: Projection<NoInfer<D>>
}>
) {
return this.$$action<{ document: D | null }>('findOne', params)
}
Expand All @@ -168,8 +172,8 @@ export class MongoDBDataAPI<InnerDoc = any> {
*/
public find<D = InnerDoc>(
params?: ExtendBaseParams<{
filter?: Filter<D>
projection?: Projection<D>
filter?: Filter<NoInfer<D>>
projection?: Projection<NoInfer<D>>
sort?: Sort
limit?: number
skip?: number
Expand All @@ -183,7 +187,7 @@ export class MongoDBDataAPI<InnerDoc = any> {
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#insert-a-single-document
*/
public insertOne<D = InnerDoc>(
params: ExtendBaseParams<{ document: AnyKeys<D> | Document }>
params: ExtendBaseParams<{ document: AnyKeys<NoInfer<D>> | Document }>
) {
return this.$$action<{ insertedId: string }>('insertOne', params)
}
Expand All @@ -193,7 +197,7 @@ export class MongoDBDataAPI<InnerDoc = any> {
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#insert-multiple-documents
*/
public insertMany<D = InnerDoc>(
params: ExtendBaseParams<{ documents: Array<AnyKeys<D> | Document> }>
params: ExtendBaseParams<{ documents: Array<AnyKeys<NoInfer<D>> | Document> }>
) {
return this.$$action<{ insertedIds: Array<string> }>('insertMany', params)
}
Expand All @@ -204,8 +208,8 @@ export class MongoDBDataAPI<InnerDoc = any> {
*/
public updateOne<D = InnerDoc>(
params: ExtendBaseParams<{
filter: Filter<D>
update: UpdateFilter<D>
filter: Filter<NoInfer<D>>
update: UpdateFilter<NoInfer<D>>
upsert?: boolean
}>
) {
Expand All @@ -222,8 +226,8 @@ export class MongoDBDataAPI<InnerDoc = any> {
*/
public updateMany<D = InnerDoc>(
params: ExtendBaseParams<{
filter: Filter<D>
update: UpdateFilter<D>
filter: Filter<NoInfer<D>>
update: UpdateFilter<NoInfer<D>>
upsert?: boolean
}>
) {
Expand All @@ -240,7 +244,7 @@ export class MongoDBDataAPI<InnerDoc = any> {
*/
public replaceOne<D = InnerDoc>(
params: ExtendBaseParams<{
filter: Filter<D>
filter: Filter<NoInfer<D>>
replacement: any
upsert?: boolean
}>
Expand All @@ -256,15 +260,19 @@ export class MongoDBDataAPI<InnerDoc = any> {
* Delete a Single Document.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#delete-a-single-document
*/
public deleteOne<D = InnerDoc>(params: ExtendBaseParams<{ filter: Filter<D> }>) {
public deleteOne<D = InnerDoc>(
params: ExtendBaseParams<{ filter: Filter<NoInfer<D>> }>
) {
return this.$$action<{ deletedCount: number }>('deleteOne', params)
}

/**
* Delete Multiple Documents.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#delete-multiple-documents
*/
public deleteMany<D = InnerDoc>(params: ExtendBaseParams<{ filter: Filter<D> }>) {
public deleteMany<D = InnerDoc>(
params: ExtendBaseParams<{ filter: Filter<NoInfer<D>> }>
) {
return this.$$action<{ deletedCount: number }>('deleteMany', params)
}

Expand Down
16 changes: 6 additions & 10 deletions tests-dts/index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,9 @@ describe('class base params', async () => {
expectType<IsAny<typeof result2.document>>(false)
expectType<{ foo: string } | null>(result2.document)

// @ts-expect-error
expectError(await api.findOne<{ bar: string }>())

const result3 = await api.findOne<{ foo: string; bar: string }>({ filter: { id: '1' } })
const result3 = await api.findOne<{ bar: string }>({ filter: { id: '1' } })
expectType<IsAny<typeof result3.document>>(false)
expectType<{ foo: string } | null>(result3.document)
expectType<{ bar: string } | null>(result3.document)
})

describe('method chaining', async () => {
Expand All @@ -87,11 +84,10 @@ describe('method chaining', async () => {
expectType<IsAny<typeof resultB.document>>(false)
expectType<{ foo: string } | null>(resultB.document)

// @ts-expect-error
expectError(await collectionC.findOne<{ bar: number }>({ filter: {} }))

const resultC = await collectionC.findOne<{ bar: string; foo: number }>({ filter: {} })
expectType<IsAny<typeof resultC.document>>(false)
expectType<number>(resultC.document.foo)
expectType<string>(resultC.document.bar)
if (resultC.document) {
expectType<number>(resultC.document.foo)
expectType<string>(resultC.document.bar)
}
})

0 comments on commit f9e7ae8

Please sign in to comment.