Skip to content

Commit

Permalink
fix: Update DeepPartial for usage of generics with Repository class (#…
Browse files Browse the repository at this point in the history
…8817)

* test: test usage of generics with Repository class

* test: cleanup

* fix: update DeepPartial to work with generic Repository

* fix: restore package-lock.json from typeorm/master
  • Loading branch information
nelsonfleig committed Apr 2, 2022
1 parent ec27803 commit 8ba742e
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 12 deletions.
20 changes: 11 additions & 9 deletions src/common/DeepPartial.ts
@@ -1,12 +1,14 @@
/**
* Same as Partial<T> but goes deeper and makes Partial<T> all its properties and sub-properties.
*/
export type DeepPartial<T> = T extends Array<infer U>
? DeepPartial<U>[]
: T extends Map<infer K, infer V>
? Map<DeepPartial<K>, DeepPartial<V>>
: T extends Set<infer M>
? Set<DeepPartial<M>>
: T extends object
? { [K in keyof T]?: DeepPartial<T[K]> }
: T
export type DeepPartial<T> =
| T
| (T extends Array<infer U>
? DeepPartial<U>[]
: T extends Map<infer K, infer V>
? Map<DeepPartial<K>, DeepPartial<V>>
: T extends Set<infer M>
? Set<DeepPartial<M>>
: T extends object
? { [K in keyof T]?: DeepPartial<T[K]> }
: T)
35 changes: 32 additions & 3 deletions test/github-issues/8681/issue-8681.ts
@@ -1,13 +1,13 @@
import { expect } from "chai"
import { DataSource, DeepPartial, Repository } from "../../../src"
import "../../utils/test-setup"
import {
closeTestingConnections,
createTestingConnections,
reloadTestingDatabases,
} from "../../utils/test-utils"
import { DataSource, DeepPartial } from "../../../src"
import { expect } from "chai"
import { Thing } from "./entity/thing.entity"
import { Item } from "./entity/item.entity"
import { Thing } from "./entity/thing.entity"

describe("github issues > #8681 DeepPartial simplification breaks the .create() and .save() method in certain cases.", () => {
let connections: DataSource[]
Expand Down Expand Up @@ -42,4 +42,33 @@ describe("github issues > #8681 DeepPartial simplification breaks the .create()
return { thing, items }
}),
))
it("should .save() and .create() complex deep partial entities using a generic repository", () =>
Promise.all(
connections.map(async (connection) => {
class AbstractService<T> {
private repository: Repository<T>
constructor(target: any) {
this.repository = new Repository(
target,
connection.manager,
)
}
create(data: DeepPartial<T>): Promise<T> {
const entity = this.repository.create(data)
return this.repository.save(entity)
}
}

const thingService = new AbstractService<Thing>(Thing)

const myThing: DeepPartial<Thing> = { id: 1 }
const thing = await thingService.create(myThing)

const thingRepository = connection.getRepository(Thing)
const dbItems = await thingRepository.find()
expect(dbItems).to.have.length(1)

return { thing }
}),
))
})

0 comments on commit 8ba742e

Please sign in to comment.