javascript - Få TypeScript standard-/initielt argumenttype for å kunne utvide den


Jeg jobber med noe kode som automatisk genererer typehint basert på funksjonskall (GraphQL Nexus-greier).

Deretter, i en av funksjonene sine, forventer den en anonym type basert på de automatisk genererte attributtene:

export const Item = {
  isTypeOf(data) {  // data's type is an anonymous type, here it would be '{ name: string }'
    ...
  }
  definition(t) {
    t.string('name')
  }
}

Imidlertid vil dette data-argumentet inneholde flere variabler enn de som er definert av funksjonskallene inne i definition. I mitt tilfelle inneholder data også et kind-attributt.

Jeg kunne bare brukt { name: string, kind: string } i dette eksempelet, men den faktiske koden min inneholder mer komplekse objekter, og jeg ville mistet alle fordelene med den automatisk genererte typingen.

Finnes det en måte for meg å utvide et argument direkte med anonym type? Jeg tenkte på noe som en initial eller default nøkkelord for å få en arguments egen type, og bruke det slik:

isTypeOf(data: initial & { kind: string })
isTypeOf(data: default & { kind: string })

Svar #1

Typescript bryr seg ikke om ekstra nøkler i objekter som sendes til en funksjon (med mindre de er laget i parameterlisten).

Hvis du bare vil akseptere objekter med gitt egenskap og ikke returnere den, bruk definisjonen av isTypeOf.

Hvis du trenger å returnere samme type og muligens utvide den, bruk definisjonen av definition.

export const Item = {
  isTypeOf(data: { kind: string }): boolean {
    return data.kind == '...';
  },
  definition<T extends { string: (key: string): void }>(t): T & { defined: true } {
    t.string('name');
    (t as T & { defined: true }).defined = true;

    return t;
  },
};

const myType = {
  kind: 'hello',
  name: 'World',
  string(key: string): {},
};

Item.isTypeOf(myType); // OK
Item.isTypeOf({ kind: 'hello', name: 'World' }); // Not OK

Item.definition(myType); // OK
Item.definition({ string(key: string): {} }); // OK

Relaterte artikler