Typescript: рд╕реБрдЭрд╛рд╡: 'рдереНрд░реЛ' рдХреНрд▓реЙрдЬ рдФрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдХреИрдЪ рдХреНрд▓реЙрдЬ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рджрд┐рд╕ре░ 2016  ┬╖  135рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

function fn(num: number): void {
    if (num === 0) {
        throw "error: can't deal with 0";
    }
}

рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рджреЛ рдЧреБрдирд╛ рд╣реИ (рдХреЛрдб рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛):

  1. рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ
  2. рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрдЧреА

рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди/рд╡рд┐рдзрд┐ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред

(рд╡реИрдХрд▓реНрдкрд┐рдХ) рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдВрдбрд░реНрд╕ рд╣реЗрдЬрд▓реНрд╕рдмрд░реНрдЧ ), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдХрд░ (рдФрд░ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛? рдЕрдзрд┐рдХ рдмрд╛рдж рдореЗрдВ) рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдЯреВрд▓ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдгред
рдпрд╣ рдмрдбрд╝реА рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрдердХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрддреА рд╣реИрдВ (рдпрд╛ TypeError рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИрдВ) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ type | Error рд╣реЛрдЧрд╛ред

рд╡реНрдпрд╛рдХрд░рдг рд╕реАрдзрд╛ рд╣реИ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдереНрд░реЛ рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

function fn() throws string { ... }
function fn(...) throws string | number { ... }

class MyError extends Error { ... }
function fn(...): Promise<string> throws MyError { ... }

рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╕рдордп рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдУрдВ) рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ:
catch(e: string | Error) { ... }

рдЙрджрд╛рд╣рд░рдг:

function fn(num: number): void throws string {
    if (num === 0) {
        throw "error: can't deal with 0";
    }
}

рдпрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдбреЗрд╡рд▓рдкрд░ (рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░/рдЖрдИрдбреАрдИ) рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП:

fn(0);

// or
try {
    fn(0); 
} catch (e: string) { ... }

рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди:

try {
    fn(0); 
} catch (e: number) { ... }

рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ number string рдирд╣реАрдВ рд╣реИред

рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рди

try {
    fn(0);
} catch(e) {
    if (typeof e === "string") {
        console.log(e.length);
    } else if (e instanceof Error) {
        console.log(e.message);
    } else if (typeof e === "string") {
        console.log(e * 3); // error: Unreachable code detected
    }

    console.log(e * 3); // error: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type
}
function fn(num: number): void {
    if (num === 0) {
        throw "error: can't deal with 0";
    }
}

string рдлреЗрдВрдХрддрд╛ рд╣реИред

function fn2(num: number) {
    if (num < 0) {
        throw new MyError("can only deal with positives");
    }

    fn(num);
}

MyError | string рдлреЗрдВрдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐:

function fn2(num: number) {
    if (num < 0) {
        throw new MyError("can only deal with positives");
    }

    try {
        fn(num);
    } catch(e) {
        if (typeof e === "string") {
           throw new MyError(e);
       } 
    }
}

рдХреЗрд╡рд▓ MyError рдлреЗрдВрдХрддрд╛ рд╣реИред

Awaiting More Feedback Suggestion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡

рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА throw рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗрдВ (рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:

  • рдпрд╣ рд░реИрдкрд┐рдВрдЧ рдЕрдзрд┐рдХ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ
  • рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрдирд╡реЙрдЗрд╕ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЗрд╕ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдорд╛рди (рдпрд╛ рддреНрд░реБрдЯрд┐) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ Tried<> рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЪреБрди рд╕рдХрддрд╛ рд╣реИред
  • рдпрд╣ рдПрдХ рдорд╛рдирдХ, рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИ рдФрд░ рджреЗрд╢реА рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ

throws рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╡реЗ рдбреЗрд╡рд▓рдкрд░ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдЕрдкрдиреЗ рдХреЛрдб, рддреАрд╕рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдореВрд▓ рдЬреЗрдПрд╕ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪреБрдирддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рд╕реБрдЭрд╛рд╡ рддреНрд░реБрдЯрд┐ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ throws рдХреНрд▓реЙрдЬ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдЬрд╛рдирдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдмрдЬрд╛рдп рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реАрдзреЗ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐ JSON.parse рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИ рдореБрдЭреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдордбреАрдПрди рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдкрдврд╝реЗрдВ рдХрд┐:

рдПрдХ SyntaxError рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреНрдп JSON рдирд╣реАрдВ рд╣реИ

рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рддреНрд░реБрдЯрд┐ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рднреА 135 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреИрдЪ рдХреНрд▓реЙрдЬ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреЗрд╣рддрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ?

@DanielRosenwasser
рд╣рд╛рдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИ (рд░рдирдЯрд╛рдЗрдо рдкрд░ рддреНрд░реБрдЯрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлреЗрдВрдХ рджреА рдЬрд╛рддреА рд╣реИ):

function fn() {
    throw "error";
}

fn();

// and
try {
    fn();
} finally {
    // do something here
}

рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп .d.ts рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛) рдФрд░ рдлрд┐рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдХрдбрд╝ рдЦрдВрдб рдХреЗ рдЕрдВрджрд░ рд░рдЦреЗрдВред

рдЪреЗрдХ рдХрд┐рдпрд╛ рд╣реБрдЖ рдереНрд░реЛ Tried<Result, Error> рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рд╣реИ?

type Tried<Result, Error> = Success<Result> | Failure<Error>;
interface Success<Result> { kind: 'result', result: Result } 
interface Failure<Error> { kind: 'failure', error: Error }
function isSuccess(tried: Tried<Result, Error>): tried is Success<Result> {
   return tried.kind === 'result';
}
function mightFail(): Tried<number, string> {
}
const tried = mightFail();
if (isSuccess(tried)) {
    console.log(tried.success);
}  else {
    console.error(tried.error);
}

рдХреЗ рдмрдЬрд╛рдП

try {
    const result: Result = mightFail();
    console.log(success);
} catch (error: Error) {
    console.error(error);
}

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡

рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА throw рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗрдВ (рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:

  • рдпрд╣ рд░реИрдкрд┐рдВрдЧ рдЕрдзрд┐рдХ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ
  • рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрдирд╡реЙрдЗрд╕ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЗрд╕ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдорд╛рди (рдпрд╛ рддреНрд░реБрдЯрд┐) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ Tried<> рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЪреБрди рд╕рдХрддрд╛ рд╣реИред
  • рдпрд╣ рдПрдХ рдорд╛рдирдХ, рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИ рдФрд░ рджреЗрд╢реА рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ

throws рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╡реЗ рдбреЗрд╡рд▓рдкрд░ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдЕрдкрдиреЗ рдХреЛрдб, рддреАрд╕рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдореВрд▓ рдЬреЗрдПрд╕ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪреБрдирддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рд╕реБрдЭрд╛рд╡ рддреНрд░реБрдЯрд┐ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ throws рдХреНрд▓реЙрдЬ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдЬрд╛рдирдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдмрдЬрд╛рдп рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реАрдзреЗ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐ JSON.parse рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИ рдореБрдЭреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдПрдордбреАрдПрди рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдкрдврд╝реЗрдВ рдХрд┐:

рдПрдХ SyntaxError рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреНрдп JSON рдирд╣реАрдВ рд╣реИ

рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рддреНрд░реБрдЯрд┐ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рддреНрд░реБрдЯрд┐ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреНрд░реБрдЯрд┐ рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рд╣реИ?

  • рд╣рд╛рдВ, рдпрд╣ рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдореВрд▓реНрдп рдХреА рддрд░рд╣ рд╣реА рдПрдХ рд╡реИрдз рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд, рддреНрдпрд╛рдЧ, рд╕рдВрдЧреНрд░рд╣реАрдд рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

  • рдЖрдк рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ рд╡рд╛рдкрд╕реА рдХреА рдХреЛрд╢рд┐рд╢ рдХреЛ рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ рдХреЛ рдПрдХ рдореЛрдиреИрдб рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореЛрдиреИрдбрд┐рдХ рдХрдВрдкреНрдпреВрдЯреЗрд╢рдВрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ

    function mightFail(): Tried<number, string> {
    }
    function mightFailToo(): Tried<number, string> {
        const tried = mightFail();
        if (isSuccess(tried))  { 
             return successFrom(tried.result * 2);
        } else {
             return tried;
        }
    }
    
  • рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рдирдХ рд╣реИ, рдЬрдм рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ libs рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдордУрд╡рд░ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╡рд╛рдж рд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдХрд╣реАрдВ рд╕реЗ рднреА рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕реЗ рдПрдХ рдордирдорд╛рдиреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдзреВрд░рд╛ рдпрд╛ рднреНрд░рд╖реНрдЯ рдЫреЛрдбрд╝рдирд╛

  • рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдХреЗрд▓реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдгрд╛рдо рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд░рдирд╛ FP рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдерд╛ рд╣реИ

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реБрдП:

  • рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░
  • рдПрдХ рдФрд░ рдереНрд░реЛ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛

рдПрдХ рдмрдиреА рд╣реБрдИ рдХрдард┐рдирд╛рдИ рджрд┐рдЦрддреА рд╣реИ

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдереНрд░реЛ рддреЗрдЬреА рд╕реЗ рдФрд░ рдЬреЛрд░ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдбрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЦрд░рд╛рдм рд▓реЗрдХрд┐рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдерд┐рддрд┐ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

// throw/catch
declare function doThis(): number throws string;
declare function doThat(): number throws string;
function doSomething(): number throws string {
    let oneResult: number | undefined = undefined;
    try {
        oneResult = doThis();
    } catch (e) {
        throw e;
    }

    let anotherResult: number | undefined = undefined;
    try {
        anotherResult = doThat();
    } catch (e) {
        throw e;
    }
    return oneResult + anotherResult;
}

// explicit results
declare function doThis(): Tried<number, string>;
declare function doThat(): Tried<number, string>;
function withBothTried<T, E, R>(one: Tried<T, E>, another: Tried<T, E>, haveBoth: (one: T, another: T) => R): Tried<T, R> {
    return isSuccess(one)
        ? isSuccess(another)
            ? successFrom(haveBoth(one.result, another.result))
            : another
        : one;
}
function add(one: number, another: number) { return one + another; }
function doSomething(): Tried<number, string> {
    return withBothTried(
        doThis(),
        doThat(),
        add
    );
}

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡

JSON.parse SyntaxError рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ .d.ts рдореЗрдВ
рдФрд░ рд╣рд╛рдБ, рдЖрдк рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ SyntaxError рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ instanceof рд╣реИред

рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рд╕рд╛рде рдЙрд╕реА рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Error рддрдХ рдлреИрд▓реА рд╣реБрдИ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдХрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд╣реА рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

рдХрднреА-рдХрднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдЖрдордВрддреНрд░рдгреЛрдВ рдХреА рдПрдХ рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдореЗрдВ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рд╣рдореЗрд╢рд╛ рд▓рд┐рдкрдЯреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ (рдореЛрдиреИрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛ред
рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлрд┐рд░ рд╕реЗ, рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдореВрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡реИрд╕реЗ рднреА рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рджреЛрдиреЛрдВ рдореЛрдиреИрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЖрдкрд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЙрдмрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рднрд╛рд╖рд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рджреЗрддреА рд╣реИ рддреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлреАрдЪрд░ рдХреЗ рд╕рдорд░реНрдерди рдХреА рдХрдореА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕:

try {
    mightFail();
} catch (e: MyError | string) {
    if (e instanceof MyError) { ... }
    else if (typeof e === "string") { ... }
    else {}
}

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЗред

рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП throw рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рдпрджрд┐ рдСрдкрд░реЗрд╢рди рд╕рдлрд▓ рд╣реБрдЖ рддреЛ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдВред
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрдм рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдЖрдк рдХреЗрд╡рд▓ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рд╕реНрд╡рдпрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛ рддреГрддреАрдп рдкрдХреНрд╖ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ instanceof рдХреЗрд╡рд▓ рдЙрд╕реА рд╡рд┐рдВрдбреЛ/рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ:

var child = window.open('about:blank');
console.log(child.Error === window.Error);

рддреЛ рдЬрдм рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:

try { child.doSomething(); } catch (e) { if (e instanceof SyntaxError) { } }

рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдкрдХрдбрд╝реЗрдВрдЧреЗ

рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдЙрд╕ рд╕реНрдерд╛рди рд╕реЗ рдмрд╣реБрдд рдЖрдЧреЗ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЙрдирд╕реЗ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ

try {
   doSomething(); // <-- uses 3rd party library that by coincidence throws SyntaxError too, but you don' t know it 
} catch (e) {}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ instanceof рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЕрдВрддрд┐рдо рдкреВрд░реНрд╡рдЬ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

class StandardError {}
class CustomError extends StandardError {
}
function doSomething() { throw new CustomError(); }
function oldCode() {
   try {
      doSomething();
   } catch (e) {
      if (e instanceof StandardError) {
          // problem
      }
   }
}

@ alexey-bykov рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдореЛрдиреИрдбрд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ, рдХрд╛рдлреА рдХрдард┐рди рдФрд░ рдХрдард┐рди рдХрд╛рдо рд╣реИред рдпрд╣ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди / рдкреНрд░рдХрд╛рд░-рд╕рдВрдЪрд╛рд▓рд┐рдд рдЙрддреНрд╕рд░реНрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рдЯрд┐рдкреНрдкрдгреА рд╣реИ рдЬреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдПрдлрдкреА рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрд╕рд╛рд╣реА рд▓реЛрдЧреЛрдВ (рд╕реНрд╡рдпрдВ рд╢рд╛рдорд┐рд▓) рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдордХрд╛рдЬреА рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИред

рджрд░рдЕрд╕рд▓, рдпрд╣рд╛рдВ рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдПрд░рд░ рдХреЛ рд╕рдмрдХреНрд▓рд╛рд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдкреИрдЯрд░реНрди рд╣реИред рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░, рдХреБрдЫ рднреА рдЬреЛ рдЗрдВрд╕реНрдЯреЛрдл рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рднреНрд░рдо рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдпрд╣ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рдЯрд┐рдкреНрдкрдгреА рд╣реИ рдЬреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдПрдлрдкреА рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рджрд░реНрд╢рдХреЛрдВ рддрдХ рдФрд░ рдЕрдзрд┐рдХ рдзрдХреЗрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрдм рддрдХ рдирд╣реАрдВ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкрдЪ рди рдЬрд╛рдП рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рди рдХрд╣рд╛ рдЬрд╛рдП, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдПрдлрдкреА рд╕рдорд░реНрдерди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдФрд░ рдпрд╣ рдЙрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдмрд╢рд░реНрддреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреЗ рдЧрдП рд╣реЛрдВ, рдмрд╕ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ TS рдЗрд╕рдХрд╛ рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рдерд╛: #2319

рдореЛрдирд╛рдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдПрдХ рдЕрд╕рд▓реА рдкрд┐рдЯрд╛ рд╣реИрдВред рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдЙрдард╛рдиреЗ, рдЙрддреНрдерд╛рдкрди рдФрд░ рдЪрдпрдирд╛рддреНрдордХ рдЪрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдпрдж рд╣реА рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рд╣реИ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдзрд╛ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИред рд╕рднреА рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдФрд░ рд▓рд┐рдлреНрдЯрд┐рдВрдЧ рдлрдВрдХреНрд╢рди (рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдмреЙрдХреНрд╕рд┐рдВрдЧ/рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ) рдХреЗрд╡рд▓ рд╢реЛрд░ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп, рдкреНрд░рднрд╛рд╡ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реИрдкрд┐рдВрдЧ/рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдорд┐рд▓рд╛ рд╣реИред рдЬрдм рддрдХ рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдвреВрдВрдв рд▓реЗрддреЗ, рддрдм рддрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдмрд┐рдирд╛ рд░реБрдХреЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдмреАрдЪ рдореЗрдВ рддрд▓рд╛рд╢рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ред

рдкреБрдирд╢реНрдЪ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд╕реНрдЯрдо рдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдордард╡рд╛рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдореИрдВ рдкрд╣рд▓реЗ рдПрдЪрдХреЗрдЯреА рдХреЛ рд░реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдХрд░реАрдм рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реВрдВред рдЗрди рд╕рдм рдмрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИред рдЗрдзрд░-рдЙрдзрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рджрд░реНрд╢рди рдФрд░ рдЬрдбрд╝реЗрдВ рдПрдХ рдЙрдЪрд┐рдд рдирд┐рд░реНрдмрд╛рдз рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рджреВрд░ рд╣реИрдВред

рдУрдкреА рдкреНрд░рд╢реНрди рдкрд░ рд╡рд╛рдкрд╕ - instanceof рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрддрд░рдирд╛рдХ рдСрдкрд░реЗрдЯрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рдЕрдкрд╡рд╛рдж Error рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдбреАрдЯреА рдпрд╛ рдХрд╕реНрдЯрдо рдкреАрдУрдЬреЗрдУ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рднреА рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдореИрдВ рдЗрд╕ рдкрд░ 50/50 рдХрд╛ рд╣реВрдВ :)

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡

рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдЬреЗрдПрд╕ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ throws рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирдпрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реАрдП рдлреЗрдВрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд░реА рдмрд╛рдд рд╣реИред
рдпрджрд┐ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

@aluanhaddad
Error рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдПрдХ рднрдпрд╛рдирдХ рдкреИрдЯрд░реНрди рдХреНрдпреЛрдВ рд╣реИ?

@gcnew
instanceof рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рдерд╛, рдореИрдВ рд╣рдореЗрд╢рд╛ рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рдорд╛рдорд▓рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣ рд╕реБрдЭрд╛рд╡ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

@nitzantomer рдореВрд▓ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЙрдкрд╡рд░реНрдЧрд┐рдд рдХрд░рдирд╛ ( Error , Array , RegExp , рдЖрджрд┐) рдкреБрд░рд╛рдиреЗ ECMAScript рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (ES6 рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдерд╛ред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕реНрддрд░ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ (рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╣рд╛рдБ рддрдХ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рджреИрдирд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ - рдЬрдм рддрдХ рдЖрдк рд╣рд╛рд▓ рдХреЗ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддрдм рддрдХ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдЙрдк-рд╡рд░реНрдЧ рди рдХрд░реЗрдВред

@gcnew
рдУрд╣, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдШрдВрдЯреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖред
рд▓реЗрдХрд┐рди рдЕрдм рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (ES6 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп)ред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рдпрд╣ рдирд╣реАрдВ рдорд╛рдирддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдХреЛ рдЙрдк-рд╡рд░реНрдЧреАрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдерд╛ред

@nitzantomer рдореИрдВ рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╕реБрдЭрд╛рд╡ Error рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рдЗрд╕реЗ рдЙрдк-рд╡рд░реНрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЦрд░рд╛рдм рдкреИрдЯрд░реНрди рдХреНрдпреЛрдВ рд╣реИред рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд░реБрдЦ рдХрд╛ рдмрдЪрд╛рд╡ рдХрд┐рдпрд╛ рдХрд┐ рдХрд╕реНрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдпрд╛ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

instanceof рдЦрддрд░рдирд╛рдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЛрдл рдСрдкрд░реЗрдЯрд░ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдирдП рдЙрдкрд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдмрдЧ рд╕реЗ рдЖрдкрдХреА рд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред instanceof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реНрдХ рдирд╛рдЬреБрдХ рд╣реИ рдФрд░ рдЦреБрд▓реЗ/рдмрдВрдж рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдореБрдЯреНрдареА рднрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗрд╕ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднреА рдирдП рд╡реНрдпреБрддреНрдкрдиреНрди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдХреА рдЧрдИ рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк рдЬреНрдЮрд╛рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рднреЗрджрд┐рдд рдпреВрдирд┐рдпрди рдпрд╛ рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдП рдЬреЛ рдЖрдкрдХреЛ рдЕрдЪреНрдЫреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рдкрд░ рднреЗрджрднрд╛рд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛрдб рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдирдП рдЬреЛрдбрд╝реЗ рдЧрдП рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд▓реНрдЯрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рдЯреВрдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ред

рдореИрдВрдиреЗ рдмрд╕ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдПрдХ рджреВрд╕рд░рд╛ рд╡рд┐рдЪрд╛рд░ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдкрд░ throws рдШреЛрд╖рдгрд╛рдПрдВ рдореМрдЬреВрдж рдереАрдВ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЗрд╕ рднрд╛рд╡рдирд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдЪрд┐рдбрд╝рдЪрд┐рдбрд╝реЗ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рддреЗрдЬреА рд╕реЗ рдирд┐рдЧрд▓ рдЬрд╛рдПрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреИрдЪ рдХреНрд▓реЙрдЬ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд░реВрдк рдореЗрдВ) рдХрднреА рднреА рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рдм рдореБрдЭреЗ рдЗрд╕ рд╕рдордЭ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдБрдЪ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдмрд╣реБрдд рдХрдо рд▓рд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдЬреИрд╕реЗ рд╕рдВрдШ рд╡рд╛рдкрд╕реА)ред

@gcnew
рдЗрд╕ рддрд░рд╣ рдпрд╣ рд╕реА # рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИрдВред
рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИред рдЕрд▓рдЧ-рдЕрд▓рдЧ lib.d.ts рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ (рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде: lib.es6.d.ts рдореЗрдВ throws рдореЗрдВ Date[Symbol.toPrimitive](hint: string) рд╣реИ)ред

рд╕рд╛рде рд╣реА, рдпрд╣ рд╕реБрдЭрд╛рд╡ рддреНрд░реБрдЯрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рддрдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖ рд░рд╣реА рд╣реЛрдВред рдЕрдиреБрдорд╛рдирд┐рдд рдЬрд╛рдБрдЪ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рдХреЛ throws рдХреНрд▓реЙрдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдЪреНрдЫреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдмрд╕ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЬреБрдбрд╝ рдЬрд╛рдПрдЧреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗ рд▓реЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛:

... рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рдмреЗрд╣рддрд░ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ

рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорд╛рдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдк рдпреВрдирд┐рдпрди рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, @ рдПрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡ Tried<> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдЧрд╛ред
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдирд╛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рдорд╛рдирдХ рд╣реИ (рдЬреЗрдПрд╕, рдЬрд╛рд╡рд╛, рд╕реА # ...) рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдорд╛рдг рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдЬрд┐рди рдореБрджреНрджреЛрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ catch рдХреНрд▓реЙрдЬ рдореЗрдВ рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред

рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рд╡реАрдПрд╕ рдореЗрдВ рдЯреВрд▓рдЯрд┐рдк рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред *.d.ts рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╢рд╛рдпрдж TS2.0 рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирдХрд▓реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@HolgerJeromin
рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА?

рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдкреНрд░рд╢реНрди рд╣реИ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ dontCare рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

function mightThrow(): void throws string {
   if (Math.random() > 0.5) {
       throw 'hey!';
   }
}

function dontCare() {
   return mightThrow();
}

рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреЛ рдХрд╣рд╛ рд╣реИ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

function dontCare(): void throws string {

рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рдареАрдХ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

function dontCare() { // <-- Checked exception wasn't handled.
         ^^^^^^^^^^

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рддрддреНрдХрд╛рд▓ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рд╕реНрдерд┐рддрд┐ рднреНрд░рд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ:

class MyClass {
    private values: number[] = [];

    keepAllValues(values: number[]) {
       for (let index = 0; index < values.length; index ++) {
            this.values.push(values[index]); 
            mightThrow();
       }
    }
}

рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдЕрдкрдиреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд╕рд▓рдиреЗ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЬрд╛рдБрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ keepAllValues рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдореВрд▓ рдЗрд░рд╛рджреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛)

рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рд╣реИ

    keepAllValues(values: number[]) {
           for (let index = 0; index < values.length; index ++) {
                this.values.push(values[index]); 
                try {
                    mightThrow();
                } catch (e) {
                    // the state of MyClass is going to be corrupt anyway
                    // but unlike the other example this is a deliberate choice
                    throw e;
                }
           }
    }

рдЕрдиреНрдпрдерд╛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯреНрд░реЛрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рдХрд┐ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдЬреЛ рдЕрднреА рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬрд╛рдБрдЪ рдЕрдкрд╡рд╛рдж рдЕрдиреБрдмрдВрдз рдкреНрд░рд╕рд╛рд░ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рдирд╣реАрдВ рд╣реИ

рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡
рдЗрд╕:

function mightThrow(): void {
   if (Math.random() > 0.5) {
       throw 'hey!';
   }
}

function dontCare() {
   return mightThrow();
}

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ mightThrow рдФрд░ dontCare рджреЛрдиреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди throws string рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐:

function dontCare() {
    try {
        return mightThrow();
    } catch (e: string) {
        // do something
    }
}

throw рдХреНрд▓реЙрдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕:

function mightThrow(): void throws string | MyErrorType { ... }

function dontCare() {
    try {
        return mightThrow();
    } catch (e: string | MyErrorType) {
        if (typeof e === "string") {
            // do something
        } else { throw e }
    }
}

throws MyErrorType рд╣реЛрдЧрд╛ред

рдЖрдкрдХреЗ keepAllValues рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:

class MyClass {
    private values: number[] = [];

    keepAllValues(values: number[]) {
       for (let index = 0; index < values.length; index ++) {
            this.values.push(values[index]); 
            mightThrow();
       }
    }
}

MyClass.keepAllValues рдХрд╛ рдЕрдиреБрдорд╛рди throws string рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ mightThrow рдПрдХ string рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЖрдкрдХреЗ keepAllValues рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ

рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЕрдкрд╡рд╛рдж mightThrow keepAllValues рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рднреНрд░рд╖реНрдЯ рдЫреЛрдбрд╝рдХрд░ рдЬреЛ рдХреБрдЫ рднреА рдХрд░ рд░рд╣реЗ рдереЗ рдЙрд╕рдХреЗ рдмреАрдЪ рдореЗрдВ рдЗрд╕реЗ рдЦрддреНрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдмрдВрдж рдХрд░ рд▓реЗрдВ рдФрд░ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЧрдВрднреАрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рддреБрд░рдВрдд рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рддрд░рд╣ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рднреНрд░рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рдЕрднреА рднреА рднреНрд░рд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХреЛрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 2 рддрд░реАрдХреЗ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдирд╛, рдЬрд┐рд╕рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рджреБрд░реНрдШрдЯрдирд╛ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдпрд╣рд╛рдБ рдареАрдХ рд╣реИрдВ
  • рдпрджрд┐ рдЖрдк рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрддрд╛ рд╣реИ: рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж - рд╕рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдЙрди рд╕рднреА рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВ рдФрд░ рдбреЙрди рдХреБрдЫ рднреА рдпрд╛рдж рдордд рдХрд░реЛ

рдЕрдм рдЕрдЧрд░ рд╣рдордиреЗ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрдм рд╣рдо рдХрдИ рдкрд░рддреЛрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рдкрдХрдбрд╝ рд░рд╣реЗ рд╣реИрдВ:

export function calculateFormula(input) {
    return calculateSubFormula(input);
}
export function calculateSubFormula(input) {
   return calculateSubSubFormula(input);
}
export function calculateSubSubFormula(input): number throws DivisionByZero  {
   return 1/input;
}

try {
   calculateFormula(0);
} catch (e: DivisionByZero) {
   // it doesn't make sense to expose DivisionByZero from under several layers of calculations
   // to the top level where nothing we can do or even know what to do about it
   // basically we cannot recover from it, because it happened outside of our immediate reach that we can control
}

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:

function boom(value: number) /* what comes here?*/  {
    return 1/value;
}

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛

// 1.
function run<R, E>(callback(): R throws E) /* what comes here? */ {
    try {
        return callback();
    } catch (e: DivisionByZero) {
        // ignore
    }
}

function throw() { return 1 / 0; }

// 2.
run(throw); /* what do we expect here? */


@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡
рддреЛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдореИрдВ рдЗрд╕рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ (рднрд▓реЗ рд╣реА рдореИрдВ рдЬрд╛рд╡рд╛ рд╕реЗ рдЖрдпрд╛ рд╣реВрдВ рдФрд░ рдЕрднреА рднреА рдЗрд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ) рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдПрд╕/рдЯреАрдПрд╕ рдЕрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рдХреЗ рдЖрджреА рд╣реИрдВред
рдпрд╣ рдПрдХ рдзреНрд╡рдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ strictNullChecks )ред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдпрд╣рд╛рдВ рд╣реИрдВрдбрд▓ рди рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЕрдм рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдЬреЗрдПрд╕ рдореЗрдВ рднреА рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдиреЗ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдпрд╣ рдЕрднреА рднреА рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реИред

0 рдЕрдВрдХ рд╕реЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:

console.log(1 / 0) // Infinity
console.log(1 / "hey!") // NaN

рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдЧрд░реВрдХ

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдЙрдирд╕реЗ рдирд┐рдкрдЯ рдирд╣реАрдВ рд╕рдХрддреЗ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рдорд╛рдорд▓реЛрдВ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ

рддреЛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╣рд╛рдБ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡
рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рдХреЛрдИ рднреА рдорд╛рдорд▓рд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХреНрдпреЛрдВ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдордВрдЧрд▓рд╛рдЪрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдиреАрдЪреЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рднрд▓реЗ рд╣реА рдореИрдВ рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ DivisionByZero рдлреЗрдВрдХрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЪрд╛рд╣реЗ рд╡рд╣ рдХрд╣рд╛рдВ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реЛ), рдореИрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВ .
рдореИрдВ рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓реЙрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдХреЛрдб рдмрджрд▓ рд╕рдХреВрдВ (рдпрджрд┐ рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ)ред

рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд░рд╣реЗрдЧрд╛ред
рдлрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рдЬреЛ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреБрдЫ рднреНрд░рдо рджреЗрдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдиреАрдЪреЗ 20 рдкрд░рддреЛрдВ рд╕реЗ рдиреАрдЪреЗ рдЙрд╕реА рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рддрддреНрдХрд╛рд▓ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдВрдЧреЗ

рдиреАрдЪреЗ 20 рдкрд░рддреЛрдВ рдореЗрдВ рд╣реБрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ

рдЖрдк рдЗрд╕реЗ рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрдкрд╡рд╛рдж рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рддреЛ рдпрд╣ рдПрдХ рдЭреВрда рд╣реИ рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдЯреАрдПрд╕ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЭреВрда рд╣реИ, рдЪрд▓реЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдФрд░ рднреА рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡
рдЖрдк рдЬреЛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред
рдХрд┐рд╕реА рдиреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдирд╛рдпрдд рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрдЧрд╛ред

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗ рдХрд┐ JSON.parse рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ lib.d.ts рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ рдФрд░ рдЖрдИрдбреАрдИ рдЙрд╕реЗ рдмрддрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреЛ рд╢рд╛рдпрдж рд╡рд╣ рдЪреБрдирдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓реЛред

рдЖрдк 20 рдкрд░рддреЛрдВ рдХреЗ рдиреАрдЪреЗ рд╣реБрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ 19 рдкрд░рддреЛрдВ рдореЗрдВ рднреНрд░рд╖реНрдЯ рд╣реИ рдФрд░ рдЖрдк рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд░рд╛рдЬреНрдп рдирд┐рдЬреА рд╣реИ

рд░рдЪрдирд╛рддреНрдордХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП: рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рддреБрд░рдВрдд рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╣рдо рдЕрдирдкреЗрдХреНрд╖рд┐рдд рднреНрд░рдо рдФрд░ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реЗ рдЕрд▓рдЧ рдЪреЗрдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рддреЗ рд╣реИрдВ:

  • рдЪреЗрдХ рдЕрдкрд╡рд╛рдж: рддрддреНрдХрд╛рд▓ рдкрд╣реБрдВрдЪ рдореЗрдВ рд╣реБрдЖ рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рддрд░рд╣ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рднреНрд░рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ
  • рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрдкрд╡рд╛рдж: рддрддреНрдХрд╛рд▓ рдкрд╣реБрдВрдЪ рдореЗрдВ рд╣реБрдЖ рдпрд╛ рдмрд╣реБрдд рдиреАрдЪреЗ, рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд░рд╛рдЬреНрдп рднреНрд░рд╖реНрдЯ рдерд╛, рдЖрдк рдЗрд╕реЗ рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ

SyntaxError рдореЗрдВ JSON.parse рдХреЛ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдЬреЛ рд╡реЗ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдм рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЗрд╕рди рдбреЗрдЯрд╛ рд▓рд┐рдЦ/рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
рдРрдк рдЗрд╕ рдЗрдирдкреБрдЯ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕ рдЬреЗрд╕рди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛, рдмреВрд▓рд┐рдпрди, рд╕рд░рдгреА, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЬреЗрд╕рди рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдпрд╣ рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп SyntaxError рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрд╕рдХрд╛ рдЗрдирдкреБрдЯ рдЕрдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЬрд╛рдирдХрд░ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдбреЗрд╡рд▓рдкрд░ рдпрд╣ рддрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред
рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд┐рддрдиреА рдЧрд╣рд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдбрд╛рд▓реА рдЧрдИ рдереАред

рджреЗрдЦрд┐рдП, рдореИрдВ рдЬреЛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЖрдкрдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ, рд╣рдо рдордВрдбрд▓рд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ

SyntaxError рдХреЛ рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдлреЗрдВрдХ рдХрд░ рдЖрдк рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ

рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рд╣реЗ, рдпрд╣ рдореЗрд░рд╛ рдХреЛрдб рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд╣ рдмреЗрд╡рдХреВрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдпрд╛ рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдЙрд╕ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рдо рд╕реЗ рдирд┐рдкрдЯреЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ, рдореИрдВ рдмрд╕ рд╡рд╣реА рдХрд╣рд╛ рдЬреЛ рдореБрдЭрд╕реЗ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛

рдФрд░ рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рдж рднреА рдЙрд╕ рддреАрд╕рд░реЗ lib рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрдкрдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕реЗ рдмрд╣рд╛рд▓ рдХрд░рдирд╛

рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛, рдЖрдкрдХреЛ рдЖрдВрддрд░рд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ( рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдореИрдВ рдЖрдкрд╕реЗ рд╡рд┐рдирддреА рдХрд░рддрд╛ рд╣реВрдВ )

рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдореБрдЭреЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред
рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣реА рдХрд╣ рд░рд╣рд╛ рд╣реВрдВред
рдЕрдЧрд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВ рдпрд╛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрддрд╛ рд╣реВрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬреЛ рд▓рд┐рдм рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпреВрдЖрдИ-рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рдХрднреА рднреА рдореЗрд░реЗ рд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдлреЗрдВрдХреА рдЬрд╛рддреА рд╣реИрдВ рдореЗрд░реЗ lib рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓ рд▓реЗрдВред

рдпрджрд┐ рдХрд┐рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдлреЗрдВрдХреЗ рдЬрд╛рдиреЗ рдкрд░ рднреНрд░рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЙрд╕реЗ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЗрд░реА рд╕реНрдерд┐рддрд┐ рджреВрд╖рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬрдореАрдиреА рд╕реНрддрд░:
рдпрд╣ рд╕реБрдЭрд╛рд╡ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред
рдЗрд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рд╡реЗ рдЪреБрдирддреЗ рд╣реИрдВ рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдПрдВред

рдЖрдк рдЕрд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЗрд╕реЗ рдбрд╛рд▓рддреЗ рд╣реИрдВ рд╡рд╣ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ

рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдпрд╛ рдкреНрд░рдХрдЯ рдЕрдкрд╡рд╛рдж рдХрд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡
рдХрд╛рдлреА рд╕рд╣реА, рдирд╛рдо рдмрджрд▓ рдЧрдпрд╛ред

@ рдЕрд▓реЗрдХреНрд╕реА-рдмрд╛рдпрдХреЛрд╡

рдЖрдк 20 рдкрд░рддреЛрдВ рдХреЗ рдиреАрдЪреЗ рд╣реБрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ 19 рдкрд░рддреЛрдВ рдореЗрдВ рднреНрд░рд╖реНрдЯ рд╣реИ рдФрд░ рдЖрдк рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд░рд╛рдЬреНрдп рдирд┐рдЬреА рд╣реИ

рдирд╣реАрдВ, рдЖрдк рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ рдФрд░ рдвреЗрд░ рдореЗрдВ рдЧрд╣рд░рд╛ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдкрдХрд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рд╕рд╛рдЭрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рди рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдиреАрдЪреЗ рдХреА рдкрд░рдд рд╕реЗ рддреБрд░рдВрдд рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ, рддреЛ рд╕рдлрд▓ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рдореМрдХрд╛ рд╣реИ, рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдкреАрдЫреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ

рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдиреАрдЪреЗ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░реЛрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдПрдХ рд╡рд╛рдХреНрдп рд╣реИ, рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ (рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ рддреЛ рдХреЛрдИ рд╡реИрд╢реНрд╡рд┐рдХ рдмрдЪрд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ' рдЯреА рдкрд╣реБрдВрдЪ)

рдЬреИрд╕рд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреНрдпрд╛рджрд╛рддрд░ рдмреЗрдХрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рдХреБрдЫ рдмреБрд░рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рдХреЗ рдЬреНрдЮрд╛рди рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ

рдпрд╣ рднреА рдЦреВрдм рд░рд╣реАред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдлреЗрдВрдХрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдкреНрд░рд▓реЗрдЦрди рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣реИред

@agonzalezjr
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рддрд░рд╣ рдЖрдкрдХреЛ рднреА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдСрдкреНрдЯ-рдЗрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдЗрд╕реЗ рдлреЗрдВрдХрдирд╛/рдкрдХрдбрд╝рдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЭрдВрдбрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ --onlyCheckedExceptions ред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ/рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХрд┐ рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдПред

@nitzantomer

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЗрд╕рди рдбреЗрдЯрд╛ рд▓рд┐рдЦ/рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
рдРрдк рдЗрд╕ рдЗрдирдкреБрдЯ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕ рдЬреЗрд╕рди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛, рдмреВрд▓рд┐рдпрди, рд╕рд░рдгреА, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЬреЗрд╕рди рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдпрд╣ рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд┐рдВрдЯреЗрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрд╕рдХрд╛ рдЗрдирдкреБрдЯ рдЕрдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдРрд╕рд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд╣рд╛рдВ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рднреА рд╣реИ рдЬрд╣рд╛рдВ _рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐_ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо JSON.parse рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдФрд░ рдПрдХ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ JSON.parse рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЦрд░рд╛рдм рдЧрдард┐рдд рдирд┐рдХрд╛рдп рд╣реЛрддрд╛ рд╣реИ? рдРрд╕рд╛ рдХреБрдЫ рднреА рдЕрд░реНрдердкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПред
рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ JSON.parse рдХреЛ рдЪреЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рд╣реИред

рдпрд╣ рд╕рдм рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЭрдВрдбреЗ рдХреЗ рдиреАрдЪреЗ рд╣реЛ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдзреНрд╡рдЬ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдореЗрд░реА рдорджрдж рдпрд╛ рдмрд╛рдзрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ java.io.FileNotFoundException рднреА рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдкрддрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЙрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдХреИрд▓реА рдирд╣реАрдВред

@aluanhaddad

рдпрд╣ рд╕реБрдЭрд╛рд╡ рдХрд┐рд╕реА рднреА рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред
рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рджреА рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдлреЗрдВрдХрддреЗ рдпрд╛ рдкрдХрдбрд╝рддреЗ рд╕рдордп)ред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдХрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдХрд░ "рд╢рд╛рдирджрд╛рд░" (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ "рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛" рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ) рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо/рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдПрдХ рдЯреВрдЯреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡реИрдз рд╕реНрдерд┐рддрд┐ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рд╕реЗ рдЙрдмрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдпрд╣ рддрдп рдХрд░рдирд╛ рднреА рдЙрд╕рдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЗрд╕ http рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рддреГрддреАрдп рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрдВ:

enum ErrorCode {
    IllFormedJsonResponse,
    ...
}
...
{
    code: ErrorCode;
    message: string;
}

рдЕрдм, рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЬрдм рдореИрдВ JSON.parse рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдПрдХ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

{
    code: ErrorCode.IllFormedJsonResponse,
    message: "Failed parsing response"
} 

рдпрджрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдпрд╣ рд╕реБрдЭрд╛рд╡ рдХрд┐рд╕реА рднреА рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдБред рдореИрдВ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред
рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдФрд░ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрдкрд╡рд╛рдж рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ (рдЕрдиреБрдорд╛рдирд┐рдд рдпрд╛ рд╕реНрдкрд╖реНрдЯ) рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдВрддрд░ рдирд┐рд╣рд┐рдд рд╣реИ, рдлрд┐рд░ рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдПред

@aluanhaddad

рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдерд╛:

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдФрд░ рдПрдХ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЗрдбрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ JSON.parse рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЦрд░рд╛рдм рдЧрдард┐рдд рдирд┐рдХрд╛рдп рд╣реЛрддрд╛ рд╣реИ? рдРрд╕рд╛ рдХреБрдЫ рднреА рдЕрд░реНрдердкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПред

рдЬрдм рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ null рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдбреЗрд╡рд▓рдкрд░ strictNullChecks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реИ рддреЛ рдЖрдк рд╡рд╣реА рдмрд╛рдд рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди null (рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдП) рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕реА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ "рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреБрдЫ рднреА рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП"ред

рд▓реЗрдХрд┐рди onlyCheckedExceptions рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ string рдХреЗ рд░реВрдк рдореЗрдВ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ Error рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░, рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рд╕рдЦреНрдд/рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдЖрдкрдХреЛ рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИрдВред

рдорддрд▓рдм, рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк рдП рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рдореИрдВ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рддрд╛ - рдпрд╣ рдореЗрд░реЗ рдХреЙрд▓рд░ рдХреЛ рдЯрд╛рдЗрдк рдмреА рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХреЙрд▓рд░ рдХреЗрд╡рд▓ рдП рдЕрдкрд╡рд╛рдж рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗред

(рд╕реВрддреНрд░ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ - рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЪреВрдХ рдЧрдпрд╛)

@shaipetel
рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдирд╣реЗрд▓реНрдб рдПрд░рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрдВрдХреНрд╢рди/рдореЗрдердб рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдлрд╝рдВрдХреНрд╢рди A | B рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ B рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ред

рдУрд╣ рдореИрдВ рд╕рдордЭрд╛ред рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреНрд░рд┐рд▓ рдбрд╛рдЙрди рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛?
рдореИрдВ рдЗрд╕реЗ рд╣реЛрддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рддреЛред рджреЗрдЦреЗрдВ, рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдкрд╡рд╛рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рд╡рд╕реНрддреБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ" рдпрд╛ "0 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ" рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдкрд╡рд╛рдж рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдИрдПрдордПрдЪрдУ, рдЗрд╕реЗ рд╕реА # рдХреА рддрд░рд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛, рдЬрд╣рд╛рдВ рд╕рднреА рдЕрдкрд╡рд╛рдж рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдпрд╛ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдФрд░ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд╣реИ рддреЛ рдЖрдк рдЕрдкрдиреЗ рдХреИрдЪ рдХреЛ рдХреИрд╕реНрдХреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдЕрдкрдиреА рдЕрдкреЗрдХреНрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рддред

@shaipetel
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ Error рд╡рд░реНрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЖрдк рдХреБрдЫ рднреА рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ:

  • throw "something went wrong"
  • throw 0
  • throw { message: "something went wrong", code: 4 }

рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдЧреЗ рдХреА рд╕реАрдорд╛рдПрдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдИрдПрдордПрдЪрдУ рдореЗрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕реАрдзреЗ рдЕрдирдЪрд╛рд╣реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИред

рддреЛ, рдпрд╣ "рдлреЗрдВрдХ 0" рдпрд╛ "рдлреЗрдВрдХ 'рдХреБрдЫ рддреНрд░реБрдЯрд┐' рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛"ред
рдЬреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдИ рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж,

@nitzantomer

рдЬрдм рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдпрджрд┐ рдбреЗрд╡рд▓рдкрд░ рд╕рдЦреНрдд рдирд▓рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реИ рддреЛ рдЖрдк рд╡рд╣реА рдмрд╛рдд рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╢реВрдиреНрдп (рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдП) рджреЗрддрд╛ рд╣реИ рддреЛ рдЙрд╕реА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ "рдХреБрдЫ рднреА рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИ"ред

рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

@shaipetel рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, Error рдФрд░ Array рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдЙрдкрд╡рд░реНрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рди рдЯрд╛рдЗрдо рдФрд░ рд╕рдВрдХрд▓рди рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред

рд╡рд┐рднрд┐рдиреНрди рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рддрд░реАрдХрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╕рд╛рд░ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдпрд╛ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрдХ рд╣реЛрддреА рд╣реИрдВред
Error рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред рдпрд╣ рддрдм рддрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ es2015 рд╕реЗ рдиреАрдЪреЗ рдХреЗ рд╕рднреА рд▓рдХреНрд╖реНрдп рдЕрдм рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред

рдпрджрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ Error рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдзрд┐рдХ рдЙрдкрд╡рд░реНрдЧ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЖрдкрддреНрддрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдпрд╛ рдЕрд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рджрд╛рд░реНрд╢рдирд┐рдХ рдЖрдкрддреНрддрд┐рдпреЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдФрд░ Error рдЙрдк-рд╡рд░реНрдЧреАрдХрд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рдЬреЛрд░ рд╕реЗ рдФрд░ рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд╣рд╛рдпрдХ рддрд░реНрдХ рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдореИрдВ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд╛рджреЗ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:

doSomethingWhichReturnsPromise()
    .then(send(200))
    .catch(NotFoundError, (error) => { send(404); })
    .catch(SomeBadDataError, (error) => { send(400); })
    .catch(CantSeeThisError, (error) => { send(403); })
    .catch((error) => { send(500); })

рдлрд┐рд░ рдирдИ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

{
    await doSomethingWhichReturnsPromise();
    send(200);
}
catch(error)
{
    if(error instanceof NotFoundError) { send(404); } 
    else if(error instanceof SomeBadDataError) { send(400); } 
    else if(error instanceof CantSeeThisError) { send(403); } 
    else { send(500); } 
}

рдЬреЛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рдкрдардиреАрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рд╣реЛ:

{
    await doSomethingWhichReturnsPromise();
    send(200);
}
catch(NotFoundError, error) { send(404); }
catch(SomeBadDataError, error) { send(404); }
catch(CantSeeThisError, error) { send(404); }
catch(error) { send(404); }

рдЬреЛ рдкрд┐рдЫрд▓реЗ рдмрд┐рдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдирд╛рд╕реНрдЯрд┐рдпрд░ рд╣реИ:

{
    await doSomethingWhichReturnsPromise();
    send(200);
}
catch<NotFoundError>(error) { send(404); }
catch<SomeBadDataError>(error) { send(404); }
catch<CantSeeThisError>(error) { send(404); }
catch(error) { send(404); }

@grofit
рдЬрдмрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛, рддреЛ рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред
рдЖрдк рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдмрд╕ рд╕рдВрдХрд▓рдХ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХрд┐ NotFoundError рдлреЗрдВрдХрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреИрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдЭрд╛рд╡ рдерд╛, рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд╛ рдореБрджреНрджрд╛ рдирд╣реАрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдзрд╛рдЧреЗ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдлрд┐рд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░ рджреВрдВрдЧрд╛ред

@grofit
рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреИрдЪ рднреА рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ (рдФрд░ рдлрд┐рд░ рд╕рдВрдХрд▓рдХ рдпрд╣ рднреА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ)ред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреИрдЪ рдХреЛ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВ, рд╢рд╛рдпрдж рдЯреАрдПрд╕ рдЯреАрдо рдЗрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдЧреА, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

@grofit

рдЬреЛ рдкрд┐рдЫрд▓реЗ рдмрд┐рдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдирд╛рд╕реНрдЯрд┐рдпрд░ рд╣реИ:

try
{
  await doSomethingWhichReturnsPromise();
  send(200);
}
catch<NotFoundError>(error) { send(404); }
catch<SomeBadDataError>(error) { send(404); }
catch<CantSeeThisError>(error) { send(404); }
catch(error) { send(404); }

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдмрдирд╛рдирд╛ рд╣реИ рдЬрдмрдХрд┐

 doSomethingWhichReturnsPromise()
    .then(send(200))
    .catch(NotFoundError, (error) => { send(404); })
    .catch(SomeBadDataError, (error) => { send(400); })
    .catch(CantSeeThisError, (error) => { send(403); })
    .catch((error) => { send(500); })

рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ instanceof рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рд╡рд┐рд╖рд╛рдХреНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Error рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдмреБрд░реА рдмрд╛рдд рд╣реИред

@nitzantomer рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред рдУрдкреА рдХреЗ рдкрд╛рд╕ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ Error рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

@aluanhaddad
@grofit рдЖрдкрд╕реЗ рдЬреЛ рдорд╛рдВрдЧрддрд╛ рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

try {
    // do something
} catch (isNotFoundError(error)) {
    ...
}  catch (isSomeBadDataError(error)) {
    ...
} catch (error) {
    ...
}

рдЬрд╣рд╛рдВ isXXX(error) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рд╣реИрдВ:
function isXXX(error): error is XXX { ... }

@nitzantomer рдпрдХреАрди рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИрдВред рдореБрджреНрджрд╛ рд╣реИ

class MyError extends Error {
  myErrorInfo: string;
}

рдЬреЛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдШрдЯрд┐рдпрд╛ рдкреНрд░рдерд╛ рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рдХрдИ рдмрдбрд╝реЗ рдФрд░ рдкреНрд░рд╕рд┐рджреНрдз рдХреЛрдб рдмреЗрд╕ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдП рд╣реИрдВред Error рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

@aluanhaddad
рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ @grofit рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди Error рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ред рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрднреА рднреА Error рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдЬреЗрдПрд╕ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ instanceof рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

@nitzantomer рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рдЧрд░реВрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдк @grofit рдХреЛ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рдереЗ рдЬреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдорд░реЗ рд╣реБрдП рдШреЛрдбрд╝реЗ рдХреЛ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдРрд╕реЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рднрд▓реЗ рд╣реА, рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдЦреЗрдж рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдХреЛрдИ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рд╣реИ? рдореБрдЭреЗ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдореЗрдВ throws рдХреНрд▓реЙрдЬ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

@aluanhaddad рдЖрдк рдХрд╣рддреЗ рд░рд╣рддреЗ рд╣реИрдВ рдХрд┐ Error рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдмреБрд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЗрд╕ рдкрд░ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдордЬрд╝рдмреВрддреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ --target рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдпрд╣реА рдХрд╛рд░рдг рдкреВрдЫрд╛ рдХрд┐ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рдерд╛ред рдереЛрдбрд╝рд╛ рдЧреБрдЧрд▓реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдЦ рдорд┐рд▓реЗ рдХрд┐ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ _ should_ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ Error рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд╣реАрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ https://github.com/Microsoft/TypeScript/issues/12123 рдФрд░ рдХрдИ рдЬреБрдбрд╝реЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ "рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг" рдореЗрдВ, рдЬреЛ рдмрд╣реБрдордд рдмрди рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ES6 рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

@nitzantomer : рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ TSLint рдЪреЗрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм @throws рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд╕рдкрд╛рд╕ рдХреЗ try/catch рдХреЗ рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

@bennyn рдореИрдВ рдПрдХ TSLint рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрднреА рднреА рдирдП рдирд┐рдпрдо рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реИ), рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдзрдиреНрдпрд╡рд╛рджред

@shaipetel (рдФрд░ @nitzantomer рднреА)

рдкреБрдирдГ:

рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдЧреЗ рдХреА рд╕реАрдорд╛рдПрдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдИрдПрдордПрдЪрдУ рдореЗрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕реАрдзреЗ рдЕрдирдЪрд╛рд╣реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИред
рддреЛ, рдпрд╣ "рдлреЗрдВрдХ 0" рдпрд╛ "рдлреЗрдВрдХ 'рдХреБрдЫ рддреНрд░реБрдЯрд┐' рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛"ред
рдЬреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдИ рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк @shaipetel рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ ... рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ throw рдХреЛ рдХреЗрд╡рд▓ Error s рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрддрд╛ рд╣реВрдВред рд░рд┐рдПрдХреНрдЯ рдХреА рдЖрдЧрд╛рдореА Async рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдПрдБ throw ing Promise s рджреНрд╡рд╛рд░рд╛ рд╣реБрдб рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ! (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рд╣реИ рдмрдирд╛рдо async / await рдФрд░ yield / yield* рдЬрдирд░реЗрдЯрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ!)

throw рдЖрдИрдПрдирдЬреА Error s рдХреНрдпрд╛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ 99% рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 100% рдирд╣реАрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ throw рдЙрди рдЪреАрдЬреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Error рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреА рд╣реИрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╣реИ, рд▓реЗрдХрд┐рди throw рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ/рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред

@ рдорд┐рдХреЗрд▓рд┐рдпреЛрдирд╛рд░реНрдб
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдХреЛрдб рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреЗрдВрдХрддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ throw "error message string" рджреЗрдЦреЗ рд╣реИрдВ)ред
рдирдпрд╛ рд░рд┐рдПрдХреНрдЯ рдлреАрдЪрд░ рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдмрд╕ рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯ, рдореИрдВ рдХреЛрдб рдХреЛ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдлреЗрдВрдХрдиреЗ рдХреЗ рдЕрдзреАрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдПрдХ рддрд░рдл, рдореБрдЭреЗ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдирдлрд░рдд рд╣реИ)ред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдереНрд░реЛ рдХреНрд▓реЙрдЬ рд╣реЛрдирд╛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА "рдХреЛрдИ рдлреЗрдВрдХрддрд╛ рд╣реИ" рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реЛред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд╛рдпрдж рдПрдХ "рдиреЛрдереНрд░реЛ" рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ "рдиреЛрдереНрд░реЛ" рдореЗрдВ рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рддрд╛ рд╣реИред)

рдпрд╣ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рдлреЗрдВрдХрддрд╛ рд╣реИред рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЯреАрдПрд╕ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдереНрд░реЛ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдереНрд░реЛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рдП рдЧрдП рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИ, рдЬреИрд╕реЗ https://stackoverflow.com/a/39209039/162530)ред

(рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╡реИрдХрд▓реНрдкрд┐рдХ) рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рднреА рдкрд╕рдВрдж рдЖрдПрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдХреЙрд▓рд░ рдХреЛ рдереНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╛ рддреЛ рдереНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рдореИрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреВрд░реЗ [рдХреЛрдгреАрдп] рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ (рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ рдЙрдирд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдВ)ред рдореИрдВ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдореЗрдВ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рд▓реМрдЯрдиреЗ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рджреЗ/рдЕрд╡рд▓реЛрдХрди рдореЗрдВ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЬрд╛рдВрдЪ рдХрд░реЗ рдХрд┐ рдореИрдВ рд╕рд╣реА рдЪреАрдЬреЗрдВ рдкрдХрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкрдХрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ)ред

@aleksey-bykov рдЖрдЗрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рди рдмрджрд▓реЗрдВ, рдЖрдЗрдП рдмрд╕ рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬреЛрдбрд╝ рджреЗрдВред :)

рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ (рдХреЛрдб рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ),
рдЙрд╕реА рддрд░рд╣ рд╣рдо рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдХрдбрд╝рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЧреБрд░реБ, 26 рдЬреБрд▓рд╛рдИ, 2018 рдХреЛ, 8:22 рдЕрдкрд░рд╛рд╣реНрди рдЬреЛ рдордЯрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@aleksey-bykov https://github.com/aleksey-bykov рдЖрдЗрдП рдЗрд╕реЗ рди рдмрджрд▓реЗрдВ
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рдХреГрддрд┐, рдЖрдЗрдП рдмрд╕ рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬреЛрдбрд╝ рджреЗрдВред :)

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/13219#issuecomment-408274156 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AA5PzfUNS5E093Z74WA4WCUaTyWRRZC3ks5uKl1FgaJpZM4LXwLC
.

рд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк async/wait рдХреЗ рдмрдЬрд╛рдп then рд╢реНрд░реГрдЦрдВрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ throw рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реНрдХреЗрдЪ рдХрд╛ рдкреНрд░рдорд╛рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

https://bit.ly/2NQZD8i - рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ

interface SafePromise<T, E> {
    then<U, E2>(
        f: (t: T) => SafePromise<U, E2>):
        SafePromise<U, E | E2>;

    catch<U, E2>(
        f: (e: E) => SafePromise<U, E2>):
        SafePromise<U, E2>

    catch<U, E1, E2>(
        guard: (e: any) => e is E1,
        f: (e: E) => SafePromise<U, E2>):
        SafePromise<U, Exclude<E, E1> | E2>
}

declare function resolve<T>(t:T): SafePromise<T, never>
declare function reject<E extends Error>(e:E): SafePromise<never, E>


class E404 extends Error {
    code:404 = 404;
}

class E403 extends Error {
    code:403 = 403;
    static check(e: any): e is E403 { return e && e.code === 403 }
}

let p = resolve(20)


let oneError = p.then(function f(x) {
    if (x > 5) return reject(new E403())
    return resolve(x)
})


let secondError = oneError.then(x => {
    if (x > 10) return reject(new E404())
    return resolve(x)
})

let remove403 = secondError.catch(E403.check, e => {
    return resolve(25)
})

let moreErrorsInfer = p.then(x => {
    if (x > 5) return reject(new E403())
    if (x > 10) return reject(new E404())
    return resolve(x)
})

let moreErrorsNoInfer = p.then((x):SafePromise<number, E403|E404> => {
    if (x > 5) return reject(new E403())
    if (x > 10) return reject(new E404())
    return resolve(x)
})

рд╡рд┐рдзреЗрдп рдкрдХрдбрд╝ рд╕рдВрдШ рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ reject() рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдХрд╛рдлреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рд╡рд╣ рд╣реИ рд╕рдВрдШ-рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди (рд╢рд╛рдпрдж рдПрдХ рдмрдЧ)

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ:

  • рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╢рд╛рдпрдж рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ)
  • рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рд╕рдВрдШ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡рд┐рдзреЗрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рднреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдХреЙрд▓рдмреИрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ "рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк" "рд╢рд╛рдпрдж-рдлреЗрдВрдХ-рдХреЛрдИ" рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХрд╣реЗрдВрдЧреЗ throws X рдпрд╛ throws never рдЕрдЧрд░ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ

declare function pureMap<T>(t:T[], f: (x:T) => U throws never):U[] throws never

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд╕реНрдХрд░рдг:

declare function dirtyMap<T>(t:T[], f: (x:T) => U):U[]

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧрд╛

declare function dirtyMap<T>(t:T[], f: (x:T) => U throws any):U[] throws any

рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рдореМрдЬреВрджрд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВред

strictNullChecks рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕реА рдорд╛рди рдХрд╛рдлреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд╣реИрдВред .d.ts рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЖрдкрдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рдХрд╛рд░), рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдкреНрд░рдпрд╛рд╕ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрдбрд╝реА рдпреВрдирд┐рдпрдиреЗрдВ рд╣реЛрдВрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рджрд╛ рдФрд░ async/await рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдордзреНрдп рдореИрджрд╛рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рджрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд░реИрдкрд░ рд╣реИ, рдФрд░ рдПрд╕рд┐рдВрдХ рдХреЛрдб рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╢рд╛рдЦрд╛рдПрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИрдВред рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ "рдЕрдирдЪреЗрдХ" рд╣реЛрдВрдЧреА

@ spion-h4 рдХреНрдпрд╛ рдпрд╣ (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА/рдЗрдЪреНрдЫрд╛) рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

declare function dirtyMap<T>(t:T[], f: (x:T) => U throws any):U[] throws any

@рдмреНрд▓реВрд▓реЛрд╡рд░реНрд╕
рдирд╣реАрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд░реНрддрдорд╛рди рдореЗрдВ throws рдХреАрд╡рд░реНрдб рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдд (рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ рдирд╛рдордорд╛рддреНрд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрд┐рд▓реНрдЯрд┐рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЕрднреА рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг:

class AnotherError extends Error {}

function* range(min: number, max: number): Iterable<number> throws TypeError, RangeError {
  if (typeof min !== 'number') {
    throw new TypeError('min must be a number')
  }
  if (typeof min !== 'number') {
    throw new TypeError('max must be a number')
  }
  if (!Number.isSafeInteger(min)) {
    // Allowed because without nominal types we can't distinguish
    // Error/RangeError/TypeError/etc
    throw new Error('min must be a safe integer')
  }
  if (!Number.isSafeInteger(max)) {
    // Also allowed because AnotherError is also structurally
    // compatible with TypeError/RangeError
    throw new AnotherError('max must be a safe integer')
  }
  for (let i = min; i < max; i++) {
    yield i
  }
}

@Jamesernator
рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдкрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

class BaseClass {
    propA!: string;
}

class MyClass1 extends BaseClass { }

class MyClass2 extends BaseClass { }

function fn(): MyClass1 {
    return new MyClass2();
}

рдпрд╣ рдПрдХ рднрд╛рд╖рд╛ рд╕реАрдорд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ @ahejlsberg рджреНрд╡рд╛рд░рд╛ рдПрдХ рдорд╣рд╛рди рдкрдврд╝рд╛ рдЧрдпрд╛ рд╣реИ: https://www.artima.com/intv/handcuffs.html

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрди рдореБрджреНрджреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ _рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡_рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ _рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ_ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдмрдбрд╝реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ - рдпрд╣ рджреЗрдЦрдирд╛ рдХрд┐ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ _might_ рдереНрд░реЛ рдФрд░ рдореИрдВ _might_ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдХрдард┐рди рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЕрдЪреНрдЫреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИ (рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдкрд░ рдХрд┐рддрдиреЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ) рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдФрд░ рдЪреВрдВрдХрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдкрд╡рд╛рдж рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлреИрд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рд╕реАрдзреЗ рдмреБрд▓рд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рднреА рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред _рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ_ред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдореВрд▓реНрдп рд╣реИрдВред NodeJS рдореЗрдВ рдХрдИ рдПрдкреАрдЖрдИ рд╡рд┐рд╕реНрддреГрдд рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧреА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, child_process.execFile() рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ exitCode рдФрд░ stderr рдЬреИрд╕реЗ рдЧреБрдг рд╣реИрдВ, $# fs.readFile() рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╣реИрдВ рдЬреИрд╕реЗ ENOENT (рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА ) рдпрд╛ EPERM (рдЕрдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрдорддрд┐рдпрд╛рдВ)ред рдореИрдВ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЬреЛ рдРрд╕рд╛ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП pg рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рджреЗрддрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рд╕рдЯреАрдХ рдХреЙрд▓рдо рдмрд╛рдзрд╛ рдХреЗ рдХрд╛рд░рдг INSERT рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ред

рдЖрдк рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рднрдВрдЧреБрд░ рд░реЗрдЧреЗрдХреНрд╕ рдЬрд╛рдВрдЪ рдХреА рдПрдХ рдЪрд┐рдВрддрд╛рдЬрдирдХ рдорд╛рддреНрд░рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╣реИрдВ рдФрд░ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВред

рдпрджрд┐ рд╣рдо @types рдШреЛрд╖рдгрд╛рдУрдВ рдФрд░ lib.d.ts рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреА рд╢рдХреНрддрд┐ рд╣реЛрдЧреА - рдЗрд╕рдореЗрдВ рдХреМрди рд╕реА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдорд╛рди рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реЗ рдЧреБрдг рд╣реИрдВред рдпрд╣ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ _not_ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдореБрджреНрджреЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ _рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛_ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ (рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореЛрдиреИрдбрд┐рдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреВрдорд┐ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдЕрд▓рдЧ рджрд┐рдЦрддреА рд╣реИ, рдХрд╛рд░реНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВ)ред

рдПрдиреЛрдЯреЗрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛)ред рдпрджрд┐ рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ any (рдпрд╛ unknown ) рдлреЗрдВрдХрддрд╛ рд╣реИред
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ throws never рдХреЗ рд╕рд╛рде рдХрднреА рдирд╣реАрдВ рдлреЗрдВрдХрдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЙрди рд╕рднреА рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдШ рдлреЗрдВрдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдкрдиреЗ throw рдХрдерди рдЬреЛ catch рдХреЗ рд╕рд╛рде try рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ catch рдЦрдВрдбред
рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ any рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди any рднреА рдлреЗрдВрдХрддрд╛ рд╣реИ - рдпрд╣ рдареАрдХ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реАрдорд╛ рдкрд░ рджреЗрд╡ рдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ рд╣реИред
рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ), рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдм рдХреИрдЪ рдХреНрд▓реЙрдЬ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдЙрдкрд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА instanceof - рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдкрд░ рд╕рдВрдШ рдХреЛ рднреЗрджрднрд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛

interface ExecError extends Error {
  status: number
  stderr: Buffer
}
function execFileSync(cmd: string): Buffer throws ExecError;
interface NoEntityError extends Error { code: 'ENOENT' }
interface PermissionError extends Error { code: 'EPERM' }
function readFileSync(file: string): Buffer throws NoEntityError | PermissionError;



md5-818797fe8809b5d8696f479ce1db4511



Preventing a runtime error due to type mismatch



md5-c2d214f4f8ecd267a9c9252f452d6588



Catching errors with type switch



md5-75d750bbe0c3494376581eaa3fa62ce5



```ts
try {
  const resp = await fetch(url, { signal })
  if (!resp.ok) {
    // inferred error type
    // look ma, no Error subclassing!
    throw Object.assign(new Error(resp.statusText), { name: 'ResponseError', response })
  }
  const data = await resp.json()
} catch (err) { // AbortError | Error & { name: 'ResponseError', response: Response } | SyntaxError
  switch (err.name)
    case 'AbortError': return; // Don't show AbortErrors
    default: displayError(err); return;
  }
}



md5-a859955ab2c42d8ce6aeedfbb6443e93



```ts
interface HttpError extends Error { status: number }
// Type-safe alternative to express-style middleware request patching - just call it (TM)
// The default express error handler recognises the status property
function checkAuth(req: Request): User throws HttpError {
    const header = req.headers.get('Authorization')
    if (!header) {
        throw Object.assign(new Error('No Authorization header'), { status: 401 })
    }
    try {
        return parseHeader(header)
    } catch (err) {
        throw Object.assign(new Error('Invalid Authorization header'), { status: 401 })
    }
}

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рднреА рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреИрд╕реЗ

  • рд╡рд┐рдЪрд▓рди (рдЕрдирдВрдд рд▓реВрдк/рд╡рд╛рдкрд╕реА рдирд╣реАрдВ)
  • рдЖрдИрдУ
  • рдЧреИрд░-рдирд┐рд░реНрдзрд╛рд░рдгрд╡рд╛рдж ( Math.random )

рдпрд╣ рдореБрдЭреЗ рдПрдордПрд╕рдЖрд░ рд╕реЗ рдХреЛрдХрд╛ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡:

function square(x: number): number &! never { // This function is pure
  return x * x
}

function square2(x : number) : number &! IO {
  console.log("a not so secret side-effect")
  return x * x
}

function square3( x : number ) : number &! Divergence {
  square3(x)
  return x * x
}

function square4( x : number ) : number &! Throws<string> { // Or maybe a simple `number &! Throws`?
  throw "oops"
  return x * x
}

function map<T, R, E>(a: T[], f :(item: T) => R &! E): R[] &! E { ... }
function map<T, R>(a: T[], f :(item: T) => R): R[] { ... } // will also work; TS would collect side effects

function str<T>(x: T): string &! (T.toString.!) // care about the side effect of a type

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ! рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛрдЧреА рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рд▓реЛрдЧ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рдЙрдирдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рдЕрдм рдЕрдкрдиреЗ рдиреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рддреЗрдЬрд╝реА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╣реИ рдФрд░ рдЙрдЪрд┐рдд http рдХреЛрдб рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ рд╣реИ - рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА - рдФрд░ рдпрд╣ рдХреЛрдИ рдордЬреЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ -_-

рдкреБрдирд╢реНрдЪ. https://github.com/Microsoft/TypeScript/issues/13219#issuecomment -428696412 рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИ - &! рдФрд░ <> рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдмрд╕ рдЕрджреНрднреБрдд рд╣реИред

рдореИрдВ рднреА рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред рдЕрдм рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдлреА рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ throws рдХреЛрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рд▓рд┐рдЦрдирд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рд▓реЛрдЧ tslint рдирд┐рдпрдо рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдмрд╛рдХреА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЖрджрд┐ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрд░рд╛рди рдерд╛ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ _already_ рдирд╣реАрдВ рдереАред рдкрд╣рд▓реА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬрд┐рд╕реЗ рдореИрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдЖрдк рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдФрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛рдПрдВрдЧреАред

рднрд▓реЗ рд╣реА рд╣рдореЗрдВ &! рди рдорд┐рд▓реЗ рдФрд░ рдХреЗрд╡рд▓ Throws<T> рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬреЛ рдХрд┐ :+1 рд╣реЛрдЧрд╛:

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореЗрд░реЗ рдорди рдореЗрдВ рд╣реИ, рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрди рдЦрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ (рд╢рд╛рдпрдж рдлрд╝рдВрдХреНрд╢рди рд╕реНрддрд░ рдкрд░, рдпрд╛ рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░) рд╕рдЦреНрдд рдПрдХреНрд╕реЗрдкреНрд╢рдирдЯреНрд░реИрдХрд┐рдВрдЧ - рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ throws X рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ $#$ try! invokeSomething() рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ рдЬрдВрдЧ рдФрд░ рддреЗрдЬ рдореЗрдВред

рдпрд╣ рдХреЗрд╡рд▓ invokeSomething() рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЦрд░рд╛рдм рдХреНрд╖рдгрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдирд┐рдкрдЯрд╛рдП рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ)

@be5invis

function square(x: number): number &! never { // This function is pure
  return x * x
}
...

рдореИрдВ рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рджреЛ рд╕реЗрдВрдЯ рджреЗ рд░рд╣рд╛ рд╣реВрдБ рд▓реЗрдХрд┐рди &! рдореБрдЭреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрджрд╕реВрд░рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ рд╡реЗ рдЗрд╕ рдкреНрд░рддреАрдХ рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд┐рди рдмреБрд▓рд╛рдП рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг throws рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ, рд╕рд╣рдЬ рдФрд░ рд╕рд░рд▓ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП +1ред рдореИрдВ

рдореИрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдФрд░ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ +1 рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ instanceof рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ, рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдкрдиреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдЖрдзрд╛рд░ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬрд┐рди рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ (рдХрдо рд╕реЗ рдХрдо) рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдФрд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВред
рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдПрдХ рд╕реБрдзрд╛рд░ рд╣реИ рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рджреЗрддрд╛ рд╣реИред рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХреМрди рд╕реЗ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХреЗ рдЧрдП рд╣реИрдВред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ, рдЖрдк рдореЗрд░реА ts-results рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП @vultix , рдЗрд╕реЗ рдЯреАрдо рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧрд╛рд╡ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

@vultix рдЖрдкрдХреЗ lib рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдпрд╣ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реИ рдЗрд╕рдХреЗ рдареАрдХ рд╡рд┐рдкрд░реАрдд рд╣реИред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рд╣реИ, рдЗрд╕реЗ рдЕрдкрд╡рд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

@nitzantomer рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрд╕реНрдерд╛рдпреА рд╕реНрдЯреИрдВрдб-рдЗрди рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреАред

function* range(min: number, max: number): Iterable<number> throws TypeError, RangeError {

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдЦреЗрд▓ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдиреАрдЪреЗ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рдмрдЬрд╛рдп рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рдЧрддрд╛ рд╣реИред

Iterable<number> throws TypeError | RangeError

рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рд╣реВрдБ .. рдХрд╛рд╢ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реЛрддрд╛ред
рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ JSON.parse() рдкрд░ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдмрд╣реБрдд рд╕реЗ рд╕рд╣рдХрд░реНрдореА рдпрд╣ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ JSON.parse рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реЗ рдЖрдЧреЗ-рдкреАрдЫреЗ рдХреА рдмрдЪрдд рдХрд░реЗрдЧрд╛ рдЕрдиреБрд░реЛрдз рдЦреАрдВрдЪреЛред

@WORMSS
рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реБрдБред
рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИ:

function mightThrow(): void throws string | MyErrorType { ... }

рдХреНрдпрд╛ рд╣рдо рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рдУрдУрдкреА рднрд╛рд╖рд╛ рдХреЗ рддреНрд░реБрдЯрд┐ рдШреЛрд╖рдгрд╛ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? "рдереНрд░реЛ" рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ "try..catch" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

@allicanseenow
рдкреНрд░рд╕реНрддрд╛рд╡ рдереНрд░реЛ рдХреНрд▓реЙрдЬ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред
рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред

@allicanseenow рдЖрдк рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рд░рд╛рдЗрдЯрдЕрдк рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд▓реЗрдЦ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: https://github.com/microsoft/TypeScript/issues/13219#issuecomment -416001890

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧрд╛рдпрдм рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рднреА рдЬрд╛рдирдирд╛ рдХрд┐ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЛ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде "рд╕реНрд╡рдд: рдкреВрд░реНрдг" рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИред

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЫреЛрдЯреЗ рдЖрд╡реЗрджрди рднреА рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдпреЛрдЧреНрдп рд╣реИрдВ - рдЕрдм рд╕рдмрд╕реЗ рдмреБрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЕрдм рдЯреЙрдк рдорд┐рд╕рд┐рдВрдЧ рдлреАрдЪрд░ рд╣реИред

@RyanCavanaugh , "рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛" рд▓реЗрдмрд▓ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рд╡рдЬрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@nitzantomer рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдереНрд░реЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рдереНрд░реЛ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛?

рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдереНрд░реЛ рдХреНрд▓реЙрдЬ рд╕рдЯреАрдХ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЦрддрд░рдирд╛рдХ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреА рдХрд┐ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдХреЙрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕реНрдЯреИрдХ рдХреЛ рдмрд┐рдирд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ajxs рдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдирдкреАрдПрдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд┐рддрдиреЗ рдЦрдВрдбрд┐рдд рд╣реИрдВред

@ConnorSinnott
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╕рд╣реА рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ:

рдХрдВрдкрд╛рдЗрд▓рд░ рдлреЗрдВрдХреЗ рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

function fn() {
    if (something) {
        throw "something happened";
    }
}

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ function fn(): throws string { ... } рд╣реЛрдЧрд╛ред
рдШреЛрд╖рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдмреЗрдореЗрд▓ рд╣реЛрдиреЗ рдкрд░ рд╕рдВрдХрд▓рдХ рднреА рддреНрд░реБрдЯрд┐ рдХрд░реЗрдЧрд╛:

function fn1() throws string | MyError {
    ...
}

function fn2() throws string {
    fn1(); // throws but not catched

    if (something) {
        throws "damn!";
    }
}

рд╕рдВрдХрд▓рдХ рдХреЛ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ fn2 рдлреЗрдВрдХрддрд╛ рд╣реИ string | MyError рди рдХрд┐ string ред

рдЗрд╕ рд╕рдм рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдзрд╛рд░рдгрд╛ рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рдХреИрд╕реЗ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдЬреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдврд╛рдВрдЪреЗ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐ рдЖрдк рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рднреА, рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЕрднреА рд╣реИ:

// can throw SyntaxError
declare function a_fancy_3rd_party_lib_function(): MyType;

function fn1() {
    if (something) {
        throws "damn!";
    }

    if (something else) {
        throws new Error("oops");
    }

    a_fancy_3rd_party_lib_function();
}

function fn2() {
    try {
        fn1();
    } catch(e) {
        if (typeof e === "string") { ... }
        else if (e instanceof MyError) { ... }
    }
}

рд╣рдо рдЗрд╕рд╕реЗ рднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд░рдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ:

function fn2() {
    try {
        fn1();
    } catch(typeof e === "string") {
        ...
    } catch(e instanceof MyError) {
        ...
    }
}

рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

function fn2() {
    try {
        fn1();
    } catch(e) {
        if (typeof e === "string") {}
        else if (e instanceof MyError) {} 
        else {
            throw e;
        }
    }
}

рдЕрд░реЗ! рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдпреЗ рдзрдиреНрдпрд╡рд╛рдж! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдереНрд░реЛ рдХрд╛ рдЕрдиреБрдорд╛рди рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рджрд┐рдпрд╛ рдЧрдпрд╛

function first() : string throws MyVeryImportantError { // Compiler complains: missing number and string
    if(something) {
        throw MyVeryImportantError
    } else {
        return second().toString();
    }
}

function second() : number {
    if(something)
        throw 5;
    else   
        return third();
}

function third() : number throws string {
    if(!something)
        throw 'oh no!';
    return 9;
}

рдореЗрд░реЗ рд▓рд┐рдП MyVeryImportantError рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХреЙрд▓рд╕реНрдЯреИрдХ рдХреА рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдЖрд╡реЗрджрди рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореБрдЯреНрдареА рднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдердХрд╛рдКред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдиреАрдЪреЗ рдирд╣реАрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдЬреЛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЖрдИрдбреАрдИ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╢реЗрд╖ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдкреНрд░реЗрдб рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред

function first() : string throws MyVeryImportantError | ... { // Spread the rest of the errors

рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛: рдХреЗрд╡рд▓ рдлреЗрдВрдХрддрд╛ рдШреЛрд╖рдгрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред

function first() : string { // Everything automatically inferred

рдЬреЛ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИ: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореБрдЭреЗ throws рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдХрдм рдорд┐рд▓реЗрдЧрд╛?

@ConnorSinnott

рдпрд╣ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдереНрд░реЛ рдХреНрд▓реЙрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рдд java.
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ string , Error (рдФрд░ рдЙрдкрд╡рд░реНрдЧ) рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ ( {} ) рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдореВрд▓ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ:

type MyBaseError = {
    message: string;
};

type CodedError = MyBaseError & {
    code: number;
}

function fn1() throws MyBaseError {
    if (something) {
        throw { message: "something went wrong" };
    }
}

function fn2() throw MyBaseError {
    if (something) {
        throw { code: 2, message: "something went wrong" };
    }

    fn1();
}

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЛ рдХреНрд▓реЙрдЬ рдмрдирд╛рдо рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬреЛ рдХреЛрдИ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдкрдврд╝реЗрдЧрд╛ рд╡рд╣ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд╛ рдЧреЛрд▓рдВрдЧ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдП:
https://gist.github.com/brandonkal/06c4a9c630369979c6038fa363ec6c83
рдлрд┐рд░ рднреА, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред

@brandonkal
рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдкрд╣рд▓реЗ рд╣реА рд╕реВрддреНрд░ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИред
рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдирд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рдЧ/рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ noexcept рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ (#36075) рдЕрднреА рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдирд╛ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдХреБрдЫ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджреА рдЧрдИ рд╣реИрдВ:

  1. рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдлреЗрдВрдХреЗрдВрдЧреЗ:
noexcept function foo(): void {
  throw new Error('Some exception'); // <- compile error!
}
  1. рдЕрдирд╛рд╡рд╢реНрдпрдХ try..catch рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА:
try { // <- warning!
  foo();
} catch (e) {}
  1. рд╕рдВрдХрд▓реНрдк рд╣рдореЗрд╢рд╛ рд╡рд╛рджрд╛:
interface ResolvedPromise<T> extends Promise<T> {
  // catch listener will never be called
  catch(onrejected?: noexcept (reason: never) => never): ResolvedPromise<T>; 

  // same apply for `.then` rejected listener,
  // resolve listener should be with `noexpect`
}

@ рдореЛрд╢реЗрд╕реНрдЯ

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдирд╛ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ "рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░" рд╕рдореВрд╣ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реВрдВред
noexcept рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЙрдкрдХрд░рдг рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред throw , try/catch рдФрд░ reject рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдореЗрдВ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрджрд┐ рдЙрдкрдХрд░рдг рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред throw , try/catch рдФрд░ reject рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдЬрд╝рд░реВрд░ред рдореИрдВ рдЙрдирдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ, рдХрд┐ noexcept рдпрд╛ throws never рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реЛрдЧреАред

рдЧреВрдВрдЧрд╛ рдЙрджрд╛рд╣рд░рдг: рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдореИрдВ Math.sqrt(-2) рдкрд░ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛ рддреЛ рдпрд╣ рдХрднреА рднреА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред

рд╡рд╣реА рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдФрд░ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

@ рдореЛрд╢реЗрд╕реНрдЯ
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ?
рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ 'рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд' рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рднреА рд▓рд╛рдн рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдХрдо рдХреЗ рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?

рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЙрдореНрд░ рд▓рдЧрддреА рд╣реИ (рдпрд╣ рдореБрджреНрджрд╛ 3 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ), рдФрд░ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо рдХрдо рд╕реЗ рдХрдо рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рдореЛрд╢реЗрд╕реНрдЯ
рдареАрдХ рд╣реИ, рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╕реБрд╡рд┐рдзрд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдВрд╢рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕рдордп рд▓рдЧреЗрдЧрд╛ рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рдореЗрдВ noexcept рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

noexcept рд╕рдорд╛рди рд╣реИ throws never ред

рдЯреАрдмреАрдПрдЪ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try/catch рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рддрдВрддреНрд░ рд╣реЛрдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рдПрд▓рд╛ рдиреЗ рдЧреЛ рдореЗрдВ error рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)

@roll рдХреЛрдИ "рдЧрд╛рд░рдВрдЯреА" рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЯрд╛рдЗрдкрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдЦреНрдд рдореЛрдб рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╛ рддреЛ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ throws рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдореЗрд░реЗ 5 рд╕реЗрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП: рдореБрдЭреЗ null рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рдЕрдкрд╡рд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ: рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд░рди-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЦрд░рд╛рдм рд╣реИред рдЕрдм, TS рдиреЗ рдЖрдкрдХреЛ null рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдЧреИрд░-рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░" рдЬреЛрдбрд╝реЗред рдореБрдЭреЗ рдЗрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдПрдХ рдХрджрдо рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ throws рдХреЛ рдЬреЛрдбрд╝рдирд╛, рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реБрдП рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлреАрдЪрд░ рдХреА рдЬрд░реВрд░ рдЬрд░реВрд░рдд рд╣реИред

рдпрджрд┐ рдЖрдк рдЧреЛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдПрдкреАрдЖрдИ рдХреЛ рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП JSON.parse , рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдФрд░ рд╣реИрдВ?)

@ obedm503 рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ TS рдХрд╛ рдПрдХ рджрд░реНрд╢рди рд╣реИ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рдпрд╣ рдПрдХ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдпрд╣ рд╕реБрдЭрд╛рдИ рдЧрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╕рдВрдж рд╣реИред
рдЕрдкрд╡рд╛рдж рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рдЕрдиреБрдорд╛рди рдкреВрд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
тЭдя╕П

рд╣реИрд▓реЛ, рдореИрдВрдиреЗ рдЯреАрдПрд╕ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдореИрдВрдиреЗ рдЕрднреА рдереЛрдбрд╝рд╛ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреЛрдк рдХреЗ рднреАрддрд░ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рди рд╣реА рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдо рд╡рд┐рдзрд┐ рдХреЗ рднреАрддрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдж рдореЗрдВ, рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЗ рднреАрддрд░ рдХреНрдпрд╛ рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдкреАрдУрд╕реА рд╣реИ

/***********************************************
 ** The part to hide a type within another type
 **********************************************/
// A symbol to hide the type without colliding with another existing type
const extraType = Symbol("A property only there to store types");

type extraType<T> = {
    [extraType]?: T;
}

// Set an extra type to any other type
type extraTyped<T, E> = T & extraType<E>

// Get back this extra type
type getExtraType<T> = T extends extraType<infer T> ? T : never;

/***********************************************
 ** The part to implement a throwable logic
 **********************************************/

// Throwable is only a type holding the possible errors which can be thrown
type throwable<T, E extends Error> = extraTyped<T,E>

// return the error typed according to the throwableMethod passed into parameter
type basicFunction = (...any: any[]) => any;
const getTypedError = function<T extends basicFunction> (error, throwableMethod:T) {
    return error as getExtraType<ReturnType<T>>;
};

/***********************************************
 ** An example of usage
 **********************************************/

class CustomError extends Error {

}

// Here is my unreliable method which can crash throwing Error or CustomError.
// The returned type is simply our custom type with what we expect as the first argument and the
// possible thrown errors types as the second (in our case a type union of Error and CustomError)
function unreliableNumberGenerator(): throwable<number, Error | CustomError> {

    if (Math.random() > 0.5) {
        return 42;
    }

    if (Math.random() > 0.5) {
        new Error('No luck');
    }

    throw new CustomError('Really no luck')
}

// Usage
try {
    let myNumber = unreliableNumberGenerator();
    myNumber + 23;
}

// We cannot type error (see TS1196)
catch (error) {
    // Therefore we redeclare a typed value here and we must tell the method which could have crashed
    const typedError = getTypedError(error, unreliableNumberGenerator);

    // 2 possible usages:
    // Using if - else clauses
    if (typedError instanceof CustomError) {

    }

    if (typedError instanceof Error) {

    }

    // Or using a switch case on the constructor:
    // Note: it would have been really cool if TS did understood the typedError.constructor is narrowed by the types Error | CustomError
    switch (typedError.constructor) {
        case Error: ;
        case CustomError: ;
    }

}

// For now it is half a solution as the switch case is not narrowing anything. This would have been 
// possible if the typedError would have been a string union however it would not be reliable to rely
// on typedError.constructor.name (considering I would have find a way to convert the type union to a string union)

рдЖрдкрдХреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдкреВрд░реЗ рд▓реМрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ throwable рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд▓рдкреЗрдЯреЗ рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕ рдПрдХ рдХреЛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рдореНрди рдХреЛрдб рдЖрдкрдХреЛ рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬреЛрдбрд╝рдиреЗ рджреЗрддрд╛ рд╣реИ:

// now only append '& throwable<ErrorsThrown>' to the returned type
function unreliableNumberGenerator(): number & throwable<Error | CustomError> { /* code */ }

рдЙрджрд╛рд╣рд░рдг рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдпрд╣рд╛рдБ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:

/***********************************************
 ** The part to hide a type within another type
 **********************************************/
// A symbol to hide the type without colliding with another existing type
const extraType = Symbol("A property only there to store types");

type extraType<T> = {
    [extraType]?: T;
}

// Get back this extra type
type getExtraType<T> = T extends extraType<infer T> ? T : never;

/***********************************************
 ** The part to implement a throwable logic
 **********************************************/

// Throwable is only a type holding the possible errors which can be thrown
type throwable<E extends Error> = extraType<E>

// return the error typed according to the throwableMethod passed into parameter
type basicFunction = (...any: any[]) => any;

type exceptionsOf<T extends basicFunction> = getExtraType<ReturnType<T>>;

const getTypedError = function<T extends basicFunction> (error: unknown, throwableMethod:T) {
    return error as exceptionsOf<T>;
};

рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ exceptionsOf рднреА рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

function anotherUnreliableNumberGenerator(): number & throwable<exceptionsOf<typeof unreliableNumberGenerator>> {
// I don't want to use a try and catch block here
    return (Math.random() > 0.5) ? unreliableNumberGenerator() : 100;
}

рдЬреИрд╕реЗ рд╣реА exceptionsOf рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдШ рдорд┐рд▓рддрд╛ рд╣реИ, рдЖрдк рдЬрд┐рддрдиреА рдЪрд╛рд╣реЗрдВ рдЙрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

function aSuperUnreliableNumberGenerator(): number & throwable<exceptionsOf<typeof unreliableNumberGenerator> | exceptionsOf<typeof anotherUnreliableNumberGenerator>> {
// I don't want to use a try and catch block here
    return (Math.random() > 0.5) ? unreliableNumberGenerator() : unreliableNumberGenerator();
}

рдореБрдЭреЗ typeof рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рдореБрдЭреЗ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЬрд╛рдП рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВрдЧрд╛

рдЖрдк рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рдпреБрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ : typedError рд▓рд╛рдЗрди 106 . рдкрд░ рд╣реЛрд╡рд░ рдХрд░реЗрдВ

@Xample рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рдореМрдЬреВрдж рдЯреВрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ!
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const a = superRiskyMethod();
const b = a + 1;

рдФрд░ рдмреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рдЕрдВрджрд░ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИ
рдпрд╣ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@luisgurmendezMLabs рдореБрдЭреЗ рд╡рд╣ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рдЬреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИред рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрди 56 рдкрд░ @Xample рдХреЗ рд░реЗрдкреЛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ myNumber + 23 number рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ, рдЬрдмрдХрд┐ myNumber: number & extraType<Error | CustomError> ред

рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, a рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрднреА рднреА рдХреЛрд╢рд┐рд╢ рдореЛрдирд╛рдб рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ & extraType<Error | CustomError> рд╡рд╛рд▓реЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд░реИрдкрд░ рдирд╣реАрдВ рд╣реИред

рд╢рд╛рдирджрд╛рд░ рдбрд┐рдЬрд╝рд╛рдЗрди @Xample рдХреЗ рд▓рд┐рдП рдмрдзрд╛рдИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

@ivawzh рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЛ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИ:

function stillARiskyMethod() { 
    const a = superRiskyMethod();
    return a + 1
}

рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ

@luisgurmendezMLabs рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рднреАрддрд░ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ (рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП)ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред

@ivawzh рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдЕрднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ

@luisgurmendezMLabs рдЖрд╣ рдареАрдХ рд╣реИ, рдореИрдВ рдЖрдкрдХреА рдмрд╛рдд рд╕рдордЭрддрд╛ рд╣реВрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдерд╛:

function stillARiskyMethod() { 
    return superRiskyMethod();
}

рд╕реНрдЯрд┐рд▓ARiskyMethod рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐

function stillARiskyMethod() { 
    return Math.random() < 0.5 superRiskyMethod() : anotherSuperRiskyMethod();
}

рдХреЗрд╡рд▓ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ superRiskyMethod() рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдЧрд╛ рдФрд░ anotherSuperRiskyMethod() рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджреЗрдЧрд╛ред рдореИрдВрдиреЗ рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рд╣реИ

рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ред

function stillARiskyMethod(): number & throwable<exceptionOf<typeof superRiskyMethod>> { 
    const a = superRiskyMethod();
    return a + 1
}

рдореИрдВ рднреА рдмрд╕ рдЗрд╕ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐/рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдлреЗрдВрдХрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛ рд╡реИрд╕реЗ рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╣рд░ рдмрд╛рд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧреЗрдЧрд╛, рдЬрдм рдЗрд╕реЗ рдПрдХ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЛрдИ рд╣реЛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЗ рдХреИрдЪ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реЛрдВ ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕/рдиреЛрдб.рдЬреЗрдПрд╕ рдореЗрдВ, рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ NextFunction (рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░) рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реВрдВред

рд╣рд░ рдмрд╛рд░ if (result instanceof Error) { next(result); } рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ рдкрдХрдбрд╝ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░, рддреЛ catch(error) { next(error); } . рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрднреА рддрдХ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ!) throws рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЦрдВрдб? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рдереНрд░реЛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдереНрд░реЛ рдХрд░рддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореМрдЬреВрдж рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ @throws рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ JSDocs рдХреА рдкреАрдврд╝реА рдореЗрдВ рднреА рдорджрдж рдХрд░реЗрдЧрд╛

рдореИрдВ рдпрд╣рд╛рдВ рд╡рд╣реА рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рдЕрдм рдкреНрд░рддрд┐рдмрджреНрдз рдореБрджреНрджреЗ рдореЗрдВ рдХрд╣рд╛ рдерд╛ред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ред

function a() {
  if (Math.random() > .5) {
    throw 'unlucky';
  }
}

function b() {
  a();
}

function c() {
  if (Math.random() > .5) {
    throw 'unlucky';
  }
  if (Math.random() > .5) {
    throw 'fairly lucky';
  }
}

function d() {
  return eval('You have no IDEA what I am capable of!');
}

function e() {
  try {
    return c;
  } catch(e) {
    throw 'too bad...';
  }
}

function f() {
  c();
}

function g() {
  a();
  c();
}
  • рдлрд╝рдВрдХреНрд╢рди a рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ 'unlucky' рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдмрд╣реБрдд рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЗрд╕реЗ Error | 'unlucky' рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП includeError ред
  • рдлрд╝рдВрдХреНрд╢рди b рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди a $ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдЧрд╛ред
  • рд╕рдорд╛рд░реЛрд╣ c рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ; 'unlucky' | 'fairly lucky' , рдпрд╛ Error | 'unlucky' | 'fairly lucky' ред
  • рд╕рдорд╛рд░реЛрд╣ d рдХреЛ рдлреЗрдВрдХрдирд╛ рд╣реЛрдЧрд╛ unknown , рдЬреИрд╕рд╛ рдХрд┐ eval рд╣реИ... рдЕрдЬреНрдЮрд╛рдд
  • рдлрд╝рдВрдХреНрд╢рди e d рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЪреВрдВрдХрд┐ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ throw рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ 'too bad...' , рдпрд╣рд╛рдВ, рдХреЗрд╡рд▓ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕рдореЗрдВ throw 'primitive value' рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ Error рдирд╣реАрдВ рдлреЗрдВрдХ рд╕рдХрддрд╛ (рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ JS рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рдЫреВрдЯ рдЧрдпрд╛ рд╣реЛ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ ...)
  • рдлрд╝рдВрдХреНрд╢рди f c рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ b рдиреЗ a рд╕реЗ рдХрд┐рдпрд╛ рдерд╛ред
  • рд╕рдорд╛рд░реЛрд╣ g рдХреЛ 'unlucky' рд╕реЗ a рдФрд░ unknown рд╕реЗ c рдЗрд╕ рдкреНрд░рдХрд╛рд░ 'unlucky' | unknown => unknown $ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ

рдпрд╣рд╛рдВ рдХреБрдЫ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреБрдбрд╝рд╛рд╡ рдЙрдирдХреЗ рдХреМрд╢рд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рджрд┐рдП рдЧрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ:

{
  "compilerOptions": {
    "errorHandelig": {
      "enable": true,
      "forceCatching": false,   // Maybe better suited for TSLint/ESLint...
      "includeError": true, // If true, every function will by default throw `Error | (types of throw expressions)`
      "catchUnknownOnly": false, // If true, every function will by default throw `unknown`, for those very skeptics (If someone replaces some global with weird proxy, for example...)
      "errorAsesertion": true,  // If false, the user will not be able to change error type manually
    }
  }
}

рддреНрд░реБрдЯрд┐ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

declare function getValue<T extends {}, K extends keyof T>(obj: T, key: K): T[K] throws void;
declare function readFile<throws E = 'not valid file'>(file: string, customError: E): string throws E;

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреНрдп рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдореВрд▓реНрдп рд╣реИ:

declare function query<T extends {}, throws E>(sql: string, error: E): T[] throws E;

app.get('path',(req, res) => {
  let user: User;
  try {
    user = query('SELECT * FROM ...', 'get user');
  } catch(e) {
    return res.status(401);
  }

  try {
    const [posts, followers] = Promise.all([
      query('SELECT * FROM ...', "user's posts"),
      query('SELECT * FROM ...', "user's follower"'),
    ]);

    res.send({ posts, followers });
  } catch(e) {
    switch (e) {
      case "user's posts":
        return res.status(500).send('Loading of user posts failed');

      case "user's posts":
        return res.status(500).send('Loading of user stalkers failed, thankfully...');

      default:
        return res.status(500).send('Very strange error!');
    }
  }
});

рдПрдХрд╛рдзрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХрдИ рдмрд╛рд░ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рд╡реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рдереЛрдХ рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ!)

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрднреА рднреА Awaiting More Feedback рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддреЗ рд╣реИрдВ рдЬрдм рдХреЛрдИ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдЧреИрд░ -200 рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

interface HttpError extends Error {
  response: Response
}

try {
  loadData()
} catch (error: Error | ResponseError) {
  if (error.response) {
    checkStatusCodeAndDoSomethingElse()
  } else {
    doGenericErrorHandling()
  }
}

рдХреИрдЪ рдмреНрд▓реЙрдХ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╣ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ 2 рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рдлреЗрдВрдХрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:

function fn(num: number): void {
    if (num === 0) {
        throw new TypeError("Can't deal with 0")
    }
}
try {
 fn(0)
}
catch (err) {
  if (err instanceof TypeError) {
   if (err.message.includes('with 0')) { .....}
  }
}

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрднреА рднреА "рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ" рдХреНрдпреЛрдВ рд╣реИ? рдЗрдВрдбреЗрдХреНрд╕рдб рдбреАрдмреА, рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдЬреИрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдпрд╣ рдХрдИ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЗрдЧреЗрд▓ рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реИред
https://hegel.js.org/docs#benefits ("рдЯрд╛рдЗрдк рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐" рдЕрдиреБрднрд╛рдЧ рддрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ)

рдХрд╛рд╢ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рдРрд╕реА рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА!

рдбреАрдПрд▓; рдбреЙ;

  • рд╡рд╛рджреЛрдВ рдХрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд╛рд░реНрдп рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • try рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдлреЗрдВрдХреЗ рдЧрдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ catch рдХреЗ рддреНрд░реБрдЯрд┐ рддрд░реНрдХ рдореЗрдВ рдПрдХ рд╕рдВрдШ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • error.constructor рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рди рдХреЗрд╡рд▓ any рдПрдХ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдПред

рдареАрдХ рд╣реИ, рд╢рд╛рдпрдж рд╣рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░реА рдЬрд╝рд░реВрд░рддреЗрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ рдХреНрдпрд╛ рд╣реИрдВ:

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ js . рдореЗрдВ 3 рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

1. рдиреЛрдб рд░рд╛рд╕реНрддрд╛

рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)

рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

import * as fs from 'fs';

fs.readFile('readme.txt', 'utf8',(error, data) => {
    if (error){
        console.error(error);
    }
    if (data){
        console.log(data)
    }
});

рдЬрд╣рд╛рдВ fs.d.ts рд╣рдореЗрдВ рджреЗрддрд╛ рд╣реИ:

function readFile(path: PathLike | number, options: { encoding: string; flag?: string; } | string, callback: (err: NodeJS.ErrnoException | null, data: string) => void): void;

рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╣реИ

    interface ErrnoException extends Error {
        errno?: number;
        code?: string;
        path?: string;
        syscall?: string;
        stack?: string;
    }

2. рд╡рд╛рджрд╛ рддрд░реАрдХрд╛

рдЬрд╣рд╛рдВ рд╡рд╛рджрд╛ рдпрд╛ рддреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдк рд╣рд▓ рдХрд┐рдП рдЧрдП value рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ reason рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рд╡рд╛рджреЗ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд╛рд░рдг any . рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

    new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рдерд╛:

    new <T, U=any>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: U) => void) => void): Promise<T>;

рдЗрд╕ рддрд░рд╣, рд╣рдо рдЕрднреА рднреА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдиреЛрдб рдХреЙрд▓рдмреИрдХ рдФрд░ рд╡рд╛рджреЗ рдХреЗ рдмреАрдЪ 1-1 рд░реВрдкрд╛рдВрддрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рднреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

const fs = require('fs')
const util = require('util')

const readFilePromise = util.promisify(fs.readFile); // (path: PathLike | number, options: { encoding: string; flag?: string; } | string) => Promise<data: string, NodeJS.ErrnoException>;

3. "рдХреЛрд╢рд┐рд╢ рдХрд░реЛ рдФрд░ рдкрдХрдбрд╝реЛ" рддрд░реАрдХрд╛

try {
    throw new Error();
}
catch (error: unknown) { //typing the error is possible since ts 4.0
    if (error instanceof Error) {
        error.message;
    }
}

рдХреИрдЪ рдмреНрд▓реЙрдХ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ "рддреНрд░реБрдЯрд┐" 2 рд▓рд╛рдЗрди рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ, TS error (рдорд╛рди) рдХреЛ Error (рдкреНрд░рдХрд╛рд░) рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ("рдЕрднреА рддрдХ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ")ред рд╣рдорд╛рд░реЗ рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рдиреЛрдб рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

async function Example() {
    try {
        const data: string = await readFilePromise('readme.txt', 'utf-8');
        console.log(data)
    }
    catch (error) { // it can only be NodeJS.ErrnoException, we can type is ourselfтАж but nothing prevents us to make a mistake
        console.error(error.message);
    }
}

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЧреБрдо рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореВрд▓ рдХрд╛рд░реНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рднреАрддрд░ рдирд╣реАрдВ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рд╣рд░ рдмрд╛рд░ "рдлреЗрдВрдХ" рдХреАрд╡рд░реНрдб рд╕реНрд░реЛрдд рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯреАрдПрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ try рдмреНрд▓реЙрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреЛрдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИ рдФрд░ рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╕рдЦреНрдд рдореЛрдб рдЯреАрдПрд╕ рдХреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдпрд╛рдиреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ try рдХреЗ рднреАрддрд░ рдПрдХ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рддрд░реАрдХрд╛ (рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдХреБрдЫ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред function example throw ErrorType { ... } рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдЧрд╛ред

рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдирд╣реАрдВ: рдПрдХ рддреНрд░реБрдЯрд┐ рдЪреВрдХрдиреЗ рд╕реЗ рд░реЛрдХреЗрдВ

рдХреБрдЫ рднреА рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдпрд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдорддрд▓рдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреНрдп рд╣реИ

try {
    if (Math.random() > 0.5) {
        throw 0
    } else {
        throw new Error()
    }
}
catch (error) { // error can be a number or an object of type Error
    if (typeof error === "number") {
        alert("silly number")
    }

    if (error instanceof Error) {
        alert("error")
    }
}

рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рддреНрд░реБрдЯрд┐ number | Error рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рдЦреНрдд рд╕реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдЕрд▓рдЧ/рдЕрдиреНрдп рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╕реНрд╡рд┐рдЪ рдХреЗрд╕ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рднреВрд▓ рдЧрдП (рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд▓реЙрдЬ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛)ред рд╣рдо (рдЬрдм рддрдХ рд╣рдо рдХреБрдЫ рд╣реИрдХрд┐рд╢ рдирд╣реАрдВ рдХрд░рддреЗ) рдХреЗрд╕ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреБрдЫ рднреА рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ (рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд╕реНрддреБ рдмрд▓реНрдХрд┐ рдПрдХ рдмреВрд▓рд┐рдпрди, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ "рдЗрдВрд╕реНрдЯреЗрдВрд╕" рдирд╣реАрдВ рд╣реИ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рдЕрдм рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

try {
    if (Math.random() > 0.5) {
        throw 0
    } else {
        throw new Error()
    }
}
catch (error) { // error can be a Number or an object of type `Error`
    switch (error.constructor){
        case Number: alert("silly number"); break;
        case Error: alert("error"); break;
    }
}

рд╣реЛрд░реЗтАж рдПрдХрдорд╛рддреНрд░ рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ TS error.constructor рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХреЗрд╕ рдХреЛ рд╕рдВрдХреАрд░реНрдг рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдЕрднреА рддрдХ?), рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЯрд╛рдЗрдк рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рднрд╛рд╖рд╛ рд╣реЛрдЧреА рдЬреЗрдПрд╕

рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dlaberge picture dlaberge  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Roam-Cooper picture Roam-Cooper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

remojansen picture remojansen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

weswigham picture weswigham  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fwanicka picture fwanicka  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ