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
