node.js - Egenskapen finns inte på returvärdet av en funktion med flera typer
Jag använder TypeScript för att skriva ett NodeJS-program.
I det här programmet importerar jag ett nodmodul som heter ts-md5, i vilket det finns en funktion hashStr(), den kan returnera ett värde av string eller Int32Array.
Jag behöver göra saker som detta i mitt program:
Md5.hashStr(str).toUpperCase();
Men kompilatorn klagar över fel:
error TS2339: Property 'toUpperCase' does not exist on type 'string | Int32Array'.
Programmet körs framgångsrikt. Eftersom det alltid returnerar string under körning. Men jag vill veta om det finns ett sätt att bli av med detta irriterande fel?
Svar #1
Du kan använda en typvakt eller en typförsäkran.
typvakt
let hash = Md5.hashStr(str);
if (typeof hash === 'string') {
hash = hash.toUpperCase();
}
typförsäkran
let hash = (<string>Md5.hashStr(str)).toUpperCase();
Fördelen med typbevakningen är att det tekniskt sett är säkrare - eftersom om du någonsin skulle få något som inte var en sträng vid körning, skulle det fortfarande fungera. Typförklaringen är helt enkelt att du åsidosätter kompilatorn, så det är tekniskt sett inte lika säkert, men det tas helt bort och resulterar därför i samma körkod som du har vid den punkt där du får felet.
Svar #2
hashStr deklareras i ts-md5-typdefinitionerna som
static hashStr(str: string, raw?: boolean): string | Int32Array;
Om man tittar på implementeringen verkar det som att det returnerar Int32Array när raw är sant, och returnerar string annars.
Givet den deklarationen kan du inte göra mycket bättre än att använda typförsäkran:
let hash = (Md5.hashStr(str) as string).toUpperCase()
Det korrekta sättet att uttrycka att returtypen beror på parametern i TypeScript är via överlagringsdeklarationer. Något liknande detta borde fungera:
static hashStr(str: string): string;
static hashStr(str: string, raw: false): string;
static hashStr(str: string, raw: true): Int32Array;
static hashStr(str: string, raw: boolean): Int32Array | string;
static hashStr(str: string, raw?: boolean): string | Int32Array {
// implementation goes here...
}
Jag skulle föreslå att du postar ett problem med ts-md5 om detta.
