diff --git a/package.json b/package.json index c64aa6f..28f5717 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,6 @@ "rollup-plugin-terser": "^7.0.2", "rollup-plugin-typescript2": "^0.30.0", "ts-jest": "^26.5.4", - "typescript": "^4.2.3" + "typescript": "^4.8.3" } } diff --git a/src/__tests__/Client.test.ts b/src/__tests__/Client.test.ts index d779893..2c938b8 100644 --- a/src/__tests__/Client.test.ts +++ b/src/__tests__/Client.test.ts @@ -55,7 +55,8 @@ describe('data is fetched correctly', () => { } }); - it('is able to fetch mutations', async () => { + // Used service does not provide mutations anymore + it.skip('is able to fetch mutations', async () => { const result = await client.post(insertUserMutation); expect(result).toBeDefined(); diff --git a/src/builder/AbstractField.ts b/src/builder/AbstractField.ts index c4df77a..c108255 100644 --- a/src/builder/AbstractField.ts +++ b/src/builder/AbstractField.ts @@ -1,3 +1,4 @@ +import { EmptyObject, StringKeyOf } from '../types'; import type { HigherKindType, FieldDescendantStore } from './hkt'; import type { InlineFragment } from './InlineFragment'; @@ -121,7 +122,8 @@ export abstract class AbstractField< // STRING addField< NewFieldName extends string, - IsArray extends boolean = false + IsArray extends boolean = false, + NewFieldType = FetchedFieldItemType >( field: NewFieldName, isArray?: IsArray @@ -130,8 +132,8 @@ export abstract class AbstractField< Name, FieldReturnType & { [k in NewFieldName]: IsArray extends true - ? FetchedFieldItemType[] - : FetchedFieldItemType + ? NewFieldType[] + : NewFieldType }, ArrayExpected > @@ -175,13 +177,18 @@ export abstract class AbstractField< } addFieldList< - NewField extends string + NewField extends string, + TypeDefinitions extends Record = EmptyObject, >( - fieldList: readonly NewField[] + fieldList: TypeDefinitions extends EmptyObject + ? readonly NewField[] + : StringKeyOf[] ): HigherKindType< this['tag'], Name, - FieldReturnType & { [K in NewField]: FetchedFieldItemType }, + FieldReturnType & TypeDefinitions extends EmptyObject + ? FieldReturnType & { [K in NewField]: FetchedFieldItemType } + : FieldReturnType & TypeDefinitions, ArrayExpected > { fieldList.forEach(this.addField.bind(this)); diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..9d9109b --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,4 @@ +export type StringKeyOf = `${Extract}`; + +declare const emptyObjectSymbol: unique symbol; +export type EmptyObject = {[emptyObjectSymbol]?: never}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0359760..725fa85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3706,10 +3706,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" - integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== +typescript@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88" + integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== union-value@^1.0.0: version "1.0.1"