2017-07-28 3 views
2

Für dieses Stück CodeEingrenzung Fehlertyp in Fang

try { 
    throw new CustomError(); 
} 
catch (err) { 
    console.log(err.aPropThatDoesNotExistInCustomError); 
} 

errany und Typen Fehler nicht auslösen. Wie kann es auf den Typ beschränkt werden, für den der Fehler erwartet wird?

Antwort

2

Sie müssen eine Überprüfung durchführen, um innerhalb eines Catch-Blocks einzugrenzen. Der Compiler weiß nicht, oder glaubt, dass err wird auf jeden Fall eine CustomError sein:

try { 
    throw new CustomError(); 
} 
catch (err) { 
    console.log('bing'); 
    if (err instanceof CustomError) { 
    console.log(err.aPropThatIndeedExistsInCustomError); //works 
    console.log(err.aPropThatDoesNotExistInCustomError); //error as expected 
    } else { 
    console.log(err); // this could still happen 
    } 
} 

Zum Beispiel, hier ist meine böse Umsetzung CustomError:

class CustomError extends Error { 
    constructor() { 
    super() 
    throw new Error('Not so fast!'); // The evil part is here 
    } 
    aPropThatIndeedExistsInCustomError: string; 
} 

In diesem Fall err wird nicht sein ein CustomError . Ich weiß, das wird wahrscheinlich nicht passieren, aber der Punkt ist, dass der Compiler das nicht automatisch für dich verengt. Wenn Sie absolut sicher von der Art sind, können Sie auf eine andere Variable zuweisen:

try { 
    throw new CustomError(); 
} 
catch (_err) { 
    const err: CustomError = _err; 
    console.log(err.aPropThatDoesNotExistInCustomError); // errors as desired 
} 

aber denken Sie daran, dass Sie möglicherweise in Schwierigkeiten zur Laufzeit ausgeführt werden können, wenn Sie über die Art irren sich.

Viel Glück!

S.S .: Weitere Informationen finden Sie unter TypeScript-Ausgaben #8677 und #9999.

+0

Danke. 'instanceof' ist hier kein Problem, der Fehlertyp ist eindeutig, außerdem ist es' CustomError', nicht unbedingt eine Instanz. 'const err: CustomError = _err' sieht aus wie ein wirklich hässlicher Hack. Ich habe # 8677 und # 9999 überprüft, und es sieht so aus, als wären sie über PR geschlossen worden, aber ich bin mir nicht sicher, wie PR das Problem gelöst hat, – estus

+0

Ich verstehe nicht, was Sie mit 'instanceof' meinen. Wenn Sie 'CustomError()' 'werfen, haben Sie eine neue Instanz der 'CustomError'-Klasse erstellt (und geworfen). Das check 'err instanceof CustomError' wird' true' zurückgeben, wenn und nur wenn 'err's Konstruktor' CustomError' Konstruktor ist. – jcalz

+0

Früher war es nicht möglich, sich mit 'instanceof' oder anderen Wächtern einzuschränken (so musste man das gefangene Objekt einer neuen verengten Variablen zuordnen), aber # 9999 reparierte diesen Teil. – jcalz