Skip to content

Commit

Permalink
feat: better typings
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeNury committed Jan 25, 2022
1 parent ad400fd commit 80660c2
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 22 deletions.
20 changes: 20 additions & 0 deletions src/types.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,26 @@ describe('Types', () => {
assert<EbriScrapConfig>(config);
})

it('should have correct return type when using ArrayConfig', () => {
type Data4 = { count: string, scripts: string[] };
const config = {
count: ".numAnn | format:number",
scripts: [
{
data: "script | extract:html",
itemSelector: "script",
containerSelector: "body"
}
]
};

const data = parse(html, config);

assert<Data4>(data);
assert<EbriScrapConfig<Data4>>(config);
assert<EbriScrapConfig>(config);
})

it('should infer correct config', () => {
const config1 = [
{
Expand Down
29 changes: 7 additions & 22 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,25 +104,10 @@ export type EbriScrapConfig<T = any> = T extends Array<any>
? EbriScrapConfigObject<T>
: string;

export type EbriScrapDataArray<T> = T extends IRawArrayConfigItem<infer U>
? EbriScrapData<U>
: unknown;

export type EbriScrapData<T> =
// Try to infer TArray
T extends EbriScrapConfigArray<infer TArray>
// If inferred as unknown, fallback on autogenerated type for array, else, return exact type (TArray)
? (unknown extends TArray ? EbriScrapDataArray<T[number]>[] : TArray[])
// If inferrence did not work but T is still an array
: T extends Array<any>
// Autogenerated type for array
? EbriScrapDataArray<T[number]>[]
// Same for objects, try to infer TObject
: T extends EbriScrapConfigObject<infer TObject>
// If any key has unknown type, fallback on autogenerated type for object, else, return exact type (TObject)
? (unknown extends TObject[keyof TObject]
? { [K in keyof T]: EbriScrapData<T[K]> }
: TObject
)
// string | number | boolean
: T;
export type EbriScrapData<TConfig> = TConfig extends string
? string
: TConfig extends Array<IRawArrayConfigItem<infer TArrayConfigData>>
? EbriScrapData<TArrayConfigData>[]
: TConfig extends object
? { [K in keyof TConfig]: EbriScrapData<TConfig[K]> }
: unknown;

0 comments on commit 80660c2

Please sign in to comment.