nullabilitate - Cum să folosești tipurile de acces indexate din TypeScript cu tipuri imbricate nullable?
Încerc să definesc un tip TypeScript în termeniul altui tip.
Acesta funcționează:
type Result = { data: { nestedData: { foo: string; bar: string } } };
type NestedData = Result['data']['nestedData'];
Dar, atunci când proprietatea data poate fi nulă, acest lucru nu funcționează:
type Result = { data: { nestedData: { foo: string; bar: string } } | null };
type NestedData = Result['data']['nestedData'];
și rezultă în eroarea:
Property 'nestedData' does not exist on type '{ nestedData: { foo: string; bar: string; }; } | null'.(2339)
Cum pot să definesc tipul meu NestedData în termeni de Result, fără a duplica vreo parte din tipurile lui Result?
Demonstrație pe TypeScript Playground
Editare: Obțin tipul meu NestedData de la un instrument de generare de cod și definesc NestedData ca un alias de tip mai scurt. În realitate, tipizarea este mai lungă, așa că vreau să minimizez repetiția.
Răspuns #1
Poți folosi NonNullable pentru a elimina null (și undefined) din uniune:
type NestedData = NonNullable<Result['data']>['nestedData']
Legătură către terenul de joacă
Echivalent, dar puțin mai detaliat, poți folosi Exclude:
type NestedData = Exclude<Result['data'], null>['nestedData']
Legătură către locul de joacă
Are sens să faci acest lucru într-unul din aceste moduri atunci când, dintr-un anumit motiv, nu poți schimba tipul tău Result. În alte situații ar fi mai natural să le definești în felul acesta:
type NestedData = { foo: string; bar: string }
type Result = { data: { nestedData: NestedData } | null }
