Skip to content

Commit e00648a

Browse files
committed
fix: Array handling
1 parent 15e4613 commit e00648a

4 files changed

Lines changed: 44 additions & 12 deletions

File tree

templates/api.ejs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,12 @@ type Flatten<T> = T extends any[] ? T[number] : T
114114
}[keyof T]
115115
: P
116116

117-
type FetchKeysArray<ResponseModel> = ResponseModel extends {
118-
results?: Array<infer DataModel>
119-
count?: number
120-
}
117+
type FetchKeysArray<ResponseModel> = ResponseModel extends (infer DataModel)[]
118+
? DotNotationKeys<DataModel>[]
119+
: ResponseModel extends {
120+
results?: Array<infer DataModel>
121+
count?: number
122+
}
121123
? DotNotationKeys<DataModel>[]
122124
: DotNotationKeys<ResponseModel>[]
123125

@@ -151,6 +153,8 @@ type Flatten<T> = T extends any[] ? T[number] : T
151153

152154
type PickKeysFromArray<ResponseModel, Keys extends string[]> = Keys extends never[]
153155
? ResponseModel
156+
: ResponseModel extends (infer DataModel)[]
157+
? Merge<ObjectWithKeysFromArray<DataModel, Keys>>[]
154158
: ResponseModel extends { results?: Array<infer DataModel>; count?: number }
155159
? Merge<
156160
Modify<

test/__generated-api.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,10 +1747,12 @@ type DotNotationKeys<T, P extends string = ''> = IsAny<T> extends true
17471747
}[keyof T]
17481748
: P
17491749

1750-
type FetchKeysArray<ResponseModel> = ResponseModel extends {
1751-
results?: Array<infer DataModel>
1752-
count?: number
1753-
}
1750+
type FetchKeysArray<ResponseModel> = ResponseModel extends (infer DataModel)[]
1751+
? DotNotationKeys<DataModel>[]
1752+
: ResponseModel extends {
1753+
results?: Array<infer DataModel>
1754+
count?: number
1755+
}
17541756
? DotNotationKeys<DataModel>[]
17551757
: DotNotationKeys<ResponseModel>[]
17561758

@@ -1787,6 +1789,8 @@ type PickKeysFromArray<
17871789
Keys extends string[]
17881790
> = Keys extends never[]
17891791
? ResponseModel
1792+
: ResponseModel extends (infer DataModel)[]
1793+
? Merge<ObjectWithKeysFromArray<DataModel, Keys>>[]
17901794
: ResponseModel extends { results?: Array<infer DataModel>; count?: number }
17911795
? Merge<
17921796
Modify<

test/__snapshots__/index.test.ts.snap

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,10 +1750,12 @@ type DotNotationKeys<T, P extends string = ''> = IsAny<T> extends true
17501750
}[keyof T]
17511751
: P
17521752
1753-
type FetchKeysArray<ResponseModel> = ResponseModel extends {
1754-
results?: Array<infer DataModel>
1755-
count?: number
1756-
}
1753+
type FetchKeysArray<ResponseModel> = ResponseModel extends (infer DataModel)[]
1754+
? DotNotationKeys<DataModel>[]
1755+
: ResponseModel extends {
1756+
results?: Array<infer DataModel>
1757+
count?: number
1758+
}
17571759
? DotNotationKeys<DataModel>[]
17581760
: DotNotationKeys<ResponseModel>[]
17591761
@@ -1790,6 +1792,8 @@ type PickKeysFromArray<
17901792
Keys extends string[]
17911793
> = Keys extends never[]
17921794
? ResponseModel
1795+
: ResponseModel extends (infer DataModel)[]
1796+
? Merge<ObjectWithKeysFromArray<DataModel, Keys>>[]
17931797
: ResponseModel extends { results?: Array<infer DataModel>; count?: number }
17941798
? Merge<
17951799
Modify<

test/index.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ describe('PickKeys', () => {
126126
type ResponseModel = { key1: string }
127127
expectTypeOf<PickKeys<ResponseModel, {}>>().toEqualTypeOf<ResponseModel>()
128128
})
129+
it('handles arrays', () => {
130+
type DataModel = { key1: string; key2: string }
131+
type ResponseModel = DataModel[]
132+
expectTypeOf<PickKeys<ResponseModel, { key1: true }>>().toEqualTypeOf<
133+
{ key1: string }[]
134+
>()
135+
})
129136
})
130137
describe('based on FetchKeys array', () => {
131138
it('picks keys from object', () => {
@@ -158,6 +165,13 @@ describe('PickKeys', () => {
158165
PickKeys<ResponseModel, never[]>
159166
>().toEqualTypeOf<ResponseModel>()
160167
})
168+
it('handles arrays', () => {
169+
type DataModel = { key1: string; key2: string }
170+
type ResponseModel = DataModel[]
171+
expectTypeOf<PickKeys<ResponseModel, ['key1']>>().toEqualTypeOf<
172+
{ key1: string }[]
173+
>()
174+
})
161175
})
162176
})
163177

@@ -199,6 +213,12 @@ describe('FetchKeys', () => {
199213
| 'key1'[]
200214
>()
201215
})
216+
it('handles arrays', () => {
217+
type MyFetchKeys = FetchKeys<{ key1: string }[]>
218+
expectTypeOf<MyFetchKeys>().toEqualTypeOf<
219+
{ key1?: true | undefined } | 'key1'[]
220+
>()
221+
})
202222
})
203223

204224
const clone = <T extends object>(object: T) =>

0 commit comments

Comments
 (0)