typescript - Egenskap saknas i typen men krävs i en annan typ?
Försöker fortfarande förstå TypeScript.
Jag försöker skriva ett destrukturerat objekt så här:
const { authError }: {authError: string} = useRouterQuery()authError måste vara en sträng för att fungera bra med andra komponenter, men useRouterQuery() använder en annan typ: ParsedUrlQuery.
Så jag får följande TypeScript-fel: Property 'authError' saknas i typen 'ParsedUrlQuery' men krävs i typen '{ authError: string; }'.
Hoppas att någon kan förklara den renaste lösningen på detta.
REDIGERA: ParsedUrlQuery-typen returnerar:
type ParsedUrlQuery = {
[x: string]: string | string[] | undefined;
}
Svar #1
Från exemplet ovan ser det ut som att ParsedUrlQuery är ett objekt som har nycklar av typen string ([x: string]) och värden som kan vara string, string[] eller undefined.
Som felet nämner, inkluderar den typen inte uttryckligen en authError-nyckel.
Det du kan göra är const { authError }: ParsedUrlQuery=useRouterQuery()
På detta sätt, om objektet som useRouterQuery returnerar har en authError-nyckel, kommer det att destruktureras och ha typen string | string[] | undefined.
Svar #2
Det finns en sak du kan göra - det är typeguard:
type ParsedUrlQuery = {
[x: string]: string | string[] | undefined;
}
/**
* Just a mock
*/
const useRouterQuery = () => ({}) as ParsedUrlQuery
const isAuthorError = (arg: any): arg is { authError: NonNullable<ParsedUrlQuery[string]> } => typeof arg?.authError === 'string'
const result = useRouterQuery()
if (isAuthorError(result)) {
/**
* Now you can be sure that authError is either string or string[]
*/
const { authError } = result
}
const { authError }: ParsedUrlQuery = useRouterQuery()
Det finns inget annat sätt som TS-kompilatorn kommer att ta reda på om authError existerar eller inte.
Här kan du hitta mer om typvakter
