ã¿ã€ãã¹ã¯ãªããåã·ã¹ãã ã¯ã»ãšãã©ã®å Žåã«åœ¹ç«ã¡ãŸãããäŸå€ãåŠçãããšãã«å©çšããããšã¯ã§ããŸããã
äŸãã°ïŒ
function fn(num: number): void {
if (num === 0) {
throw "error: can't deal with 0";
}
}
ããã§ã®åé¡ã¯2ã€ãããŸãïŒã³ãŒãã調ã¹ãªãã§ïŒïŒ
å€ãã®ã·ããªãªã§ã¯ããããã¯å®éã«ã¯åé¡ã§ã¯ãããŸããããé¢æ°/ã¡ãœãããäŸå€ãã¹ããŒããå¯èœæ§ããããã©ãããç¥ãããšã¯ãããŸããŸãªã·ããªãªãç¹ã«ããŸããŸãªã©ã€ãã©ãªã䜿çšããå Žåã«éåžžã«åœ¹ç«ã¡ãŸãã
ïŒãªãã·ã§ã³ã®ïŒãã§ãã¯ãããäŸå€ãå°å
¥ããããšã«ãããåã·ã¹ãã ãäŸå€åŠçã«å©çšã§ããŸãã
ãã§ãã¯ãããäŸå€ãåæãããŠããªãããšã¯ç¥ã£ãŠããŸããïŒããšãã°ã Anders Hejlsberg ïŒãããããªãã·ã§ã³ã«ããããšã§ïŒãããŠããããåŸã§æšæž¬ãããŸããïŒïŒãéçºè
ãããŒã«ãããã³ããã¥ã¡ã³ããŒã·ã§ã³ã
ãŸãã倧èŠæš¡ãªå€§èŠæš¡ãããžã§ã¯ãã§æå³ã®ããã«ã¹ã¿ã ãšã©ãŒãããé©åã«äœ¿çšã§ããããã«ãªããŸãã
ãã¹ãŠã®javascriptã©ã³ã¿ã€ã ãšã©ãŒã¯ã¿ã€ãErrorïŒãŸãã¯TypeError
ãªã©ã®æ¡åŒµã¿ã€ãïŒã§ãããããé¢æ°ã®å®éã®ã¿ã€ãã¯åžžã«type | Error
ã«ãªããŸãã
ææ³ã¯åçŽã§ãé¢æ°å®çŸ©ã¯ãthrowsç¯ã®åŸã«ã¿ã€ããç¶ããããšã§çµäºã§ããŸãã
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";
}
}
ããã§ãé¢æ°ããšã©ãŒãã¹ããŒããå¯èœæ§ãããããšã©ãŒãæååã«ãªãããšã¯æããã§ãããããã£ãŠããã®ã¡ãœãããåŒã³åºããšãéçºè
ïŒããã³ã³ã³ãã€ã©ãŒ/ IDEïŒã¯ãããèªèããããé©åã«åŠçã§ããŸãã
ããïŒ
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
ã®ã¿ãã¹ããŒããŸãã
æ確ã«ããããã«ãããã§ã®ã¢ã€ãã¢ã®1ã€ã¯ããŠãŒã¶ãŒã«äŸå€ããã£ãããããã®ã§ã¯ãªããcatchå¥å€æ°ã®ã¿ã€ããããé©åã«æšæž¬ããããšã§ãã
@DanielRosenwasser
ã¯ãããŠãŒã¶ãŒã¯äŸå€ããã£ããããããšã匷å¶ãããªãã®ã§ãããã¯ã³ã³ãã€ã©ãŒã§åé¡ãããŸããïŒå®è¡æã«ãšã©ãŒãã¹ããŒãããŸãïŒïŒ
function fn() {
throw "error";
}
fn();
// and
try {
fn();
} finally {
// do something here
}
ããããããã¯éçºè
ã«ã©ã®äŸå€ãã¹ããŒã§ããããè¡šçŸããæ¹æ³ãæäŸãïŒä»ã®ã©ã€ãã©ãª.d.ts
ãã¡ã€ã«ã䜿çšãããšãã«ãããæã£ãŠãããšçŽ æŽãããã§ãããïŒãã³ã³ãã€ã©ã¿ã€ãã«catchå¥å
ã®äŸå€ã¿ã€ããä¿è·ãããŸãã
ãã§ãã¯ã¹ããŒã¯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);
}
@ aleksey-bykov
ç§ã®ã³ãŒãã§throw
ããŸã£ãã䜿çšããã代ããã«çµæãïŒãšã©ãŒãçºçããå¯èœæ§ã®ããé¢æ°ã§ïŒã©ããããããšãææ¡ããŠããŸãã
ãã®ã¢ãããŒãã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã
Tried<>
ãååŸããé¢æ°ã¯ãšã©ãŒãç¡èŠããããšãéžæã§ããŸãããthrows
ãè¿œå ãããšãã³ãŒãã3çªç®ã®ã©ã€ãã©ãªããã€ãã£ãjsããã®ãšã©ãŒãåŠçããããšãéžæããéçºè
ãæå¹ã«ãªããŸãã
ææ¡ã§ã¯ãšã©ãŒã®æšæž¬ãèŠæ±ããããããçæããããã¹ãŠã®å®çŸ©ãã¡ã€ã«ã«throws
å¥ãå«ããããšãã§ããŸãã
ããã¥ã¡ã³ãã«ç§»åããå¿
èŠãããçŸåšã®ç¶æ
ã§ã¯ãªããé¢æ°ãå®çŸ©ãã¡ã€ã«ããçŽæ¥ã¹ããŒããå¯èœæ§ã®ãããšã©ãŒãç¥ãããšã¯éåžžã«äŸ¿å©ã§ããããšãã°ã JSON.parse
ãã¹ããŒããå¯èœæ§ã®ãããšã©ãŒãç¥ãå¿
èŠããããŸãã MDNããŒãžã«ç§»åãã次ã®ããã«èªã¿ãŸãã
解æããæååãæå¹ãªJSONã§ãªãå Žåã
SyntaxError
äŸå€ãã¹ããŒããŸã
ãããŠãããã¯ãšã©ãŒãææžåãããŠããå Žåã®è¯ãã±ãŒã¹ã§ãã
ãããŠãããã¯ãšã©ãŒãææžåãããŠããå Žåã®è¯ãã±ãŒã¹ã§ãã
SyntaxErrorãšErrorãåºå¥ããããã®ä¿¡é Œã§ããæ¹æ³ãjavascriptã«ãããŸããïŒ
ã¯ããããã¯ããå€ãã®ã³ãŒãã§ãããæªãç¶æ³ã¯ãªããžã§ã¯ãã§è¡šããããããä»ã®å€ãšåãããã«ãåŠçãç Žæ£ãä¿åããŸãã¯æå¹ãªçµæã«å€æããããã«æž¡ãããšãã§ããŸã
tryãè¿ãããšã§tryedãç¡èŠã§ããŸããtryedã¯ã¢ãããšèŠãªãããšãã§ããã¢ããèšç®ãæ¢ããŸã
function mightFail(): Tried<number, string> {
}
function mightFailToo(): Tried<number, string> {
const tried = mightFail();
if (isSuccess(tried)) {
return successFrom(tried.result * 2);
} else {
return tried;
}
}
ããã¯ã³ãŒãã«ãšã£ãŠååã«æšæºçã§ããäŸå€ãã¹ããŒãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã«é¢ããŠã¯ãäŸå€ãã確å®ã«å埩ããããšã¯ã»ãŒäžå¯èœã§ãããããéåžžã¯ã²ãŒã ãªãŒããŒãæå³ããŸããçç±ã¯ãã³ãŒãå ã®ã©ãããã§ãã¹ããŒã§ããããã§ããä»»æã®äœçœ®ã§çµäºããå éšç¶æ ãäžå®å šãŸãã¯ç ŽæãããŸãŸã«ãã
JavaScriptã©ã³ã¿ã€ã ããã®ãã§ãã¯ãããäŸå€ã¯ãµããŒããããŠããŸããããŸããtypescriptã ãã§å®è£ ããããšã¯ã§ããŸããã
ç¹å¥ãªçµæã®å ŽåãšããŠäŸå€ããšã³ã³ãŒãããããšä»¥å€ã¯ã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
);
}
@ aleksey-bykov
JSON.parse
ãSyntaxError
ãã¹ããŒããå¯èœæ§ããããšããç§ã®ãã€ã³ãã¯ãé¢æ°ãã¹ããŒãããå¯èœæ§ãããããšãç¥ãããã«ãããã¥ã¡ã³ãã§é¢æ°ã調ã¹ãå¿
èŠããããšããããšã§ãã .d.ts
ã§ããã確èªããæ¹ãç°¡åã§ãã
ã¯ãã instanceof
SyntaxError
ã§ããããšãããããŸãã
ãšã©ãŒãã¹ããŒããããšã§ãåãæªãç¶æ³ãè¡šãããšãã§ããŸãã
Error
ãæ¡åŒµããç¬èªã®ãšã©ãŒã¯ã©ã¹ãäœæããå¿
èŠãªãã¹ãŠã®é¢é£ããŒã¿ããã®ã¯ã©ã¹ã«å
¥ããããšãã§ããŸãã
ããå°ãªãã³ãŒãã§åãçµæãåŸãããŸãã
é¢æ°åŒã³åºãã®ãã§ãŒã³ãé·ãããã§ãŒã³ã®ããŸããŸãªã¬ãã«ã§ãšã©ãŒã®äžéšãåŠçãããå ŽåããããŸãã
åžžã«ã©ãããããçµæïŒã¢ããïŒã䜿çšããã®ã¯ããªãé¢åã§ãã
èšããŸã§ããªãããšã«ããä»ã®ã©ã€ãã©ãªãšãã€ãã£ããšã©ãŒãã¹ããŒãããå¯èœæ§ããããããã¢ãããštry / catchã®äž¡æ¹ã䜿çšããããšã«ãªããŸãã
ç§ã¯ããªãã«åæããŸãããå€ãã®å Žåãããªãã¯æãããããšã©ãŒããå埩ããããšãã§ããŸãããããŠèšèªãããªãããããããããè¡šçŸããããšãå¯èœã«ãããªãã°ãããã¯ããããã®ãããç°¡åã§ãããã
typescriptã®å€ãã®ãã®ãšåæ§ã«ãjavascriptã®æ©èœã®ãµããŒãã®æ¬ åŠã¯åé¡ã§ã¯ãããŸããã
ãã®ïŒ
try {
mightFail();
} catch (e: MyError | string) {
if (e instanceof MyError) { ... }
else if (typeof e === "string") { ... }
else {}
}
ã¿ã€ãã¢ãããŒã·ã§ã³ãªãã§ãjavascriptã§æåŸ ã©ããã«æ©èœããŸãã
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
}
}
}
@ aleksey-bykovã¢ããã£ãã¯æ§é ã§ææ¡ããããã«ãæ瀺çã«ãšã©ãŒãã¹ã¬ããåããããšã¯ãéåžžã«å°é£ã§å°é£ãªäœæ¥ã§ãã ããã¯å€ãã®åªåãèŠããã³ãŒããç解ããã®ãé£ããããèšèªãµããŒã/ã¿ã€ãé§ååã®emitãèããããããã«ããå¿ èŠããããŸãã ããã¯ãHaskellãšFPå šäœã®æ®åã«åãå ¥ããŠãã人ããã®ã³ã¡ã³ãã§ãã
ããã¯ãç¹ã«æ奜家ïŒç§èªèº«ãå«ãïŒã«ãšã£ãŠã¯å®çšçãªä»£æ¿æ段ã§ãããããå€ãã®èŽè¡ã«ãšã£ãŠå®è¡å¯èœãªéžæè¢ã§ã¯ãªããšæããŸãã
å®éãããã§ã®ç§ã®äž»ãªæžå¿µã¯ã人ã ããšã©ãŒã®ãµãã¯ã©ã¹åãéå§ããããšã§ãã ããã¯ã²ã©ããã¿ãŒã³ã ãšæããŸãã ããäžè¬çã«ã¯ãinstanceofæŒç®åã®äœ¿çšãä¿é²ãããã®ã¯ãã¹ãŠãã¯ã©ã¹ã®åšãã«è¿œå ã®æ··ä¹±ãåŒãèµ·ããã ãã§ãã
ããã¯ãHaskellãšFPå šäœã®æ®åã«åãå ¥ããŠãã人ããã®ã³ã¡ã³ãã§ãã
ç§ã¯ããããæ¶åãããŠããå€ãã®ããšãæ±ãããããŸã§ã§ã¯ãªãããããèŽè¡ã«ãã£ãšåŒ·ãæŒãä»ããã¹ãã ãšæ¬åœã«æããŸããèšèªã§ããè¯ãFPãµããŒããåŸãããšãã§ããŸããïŒ
ãã¹ãŠã®ã³ã³ãããŒã¿ããã§ã«äœæãããŠããå Žåã¯ãç§ãã¡ã®ãããžã§ã¯ãã®ããã«ããããã䜿çšããŠããŒã¿ãããŒãæ§ç¯ããã ãã§ãæã£ãã»ã©é£ããã¯ãããŸããããTSããããããé©åã«ãµããŒãã§ããå¯èœæ§ãããããšã«åæããŸãïŒïŒ2319
ã¢ããå€æåã¯æ¬ç©ã®PITAã§ãã ããªãã¯ããªãé »ç¹ã«æã¡äžããå·»ãäžãããããŠéžæçãªèµ°ããããå¿ èŠããããŸãã æçµçãªçµæã¯ãã»ãšãã©ç解ã§ããªãã³ãŒãã§ãããå¿ èŠãªåå ¥éå£ãããã¯ããã«é«ããªããŸãã ãã¹ãŠã®ã³ã³ãããŒã¿ãšãªããã£ã³ã°æ©èœïŒå¿ é ã®ãã¯ã·ã³ã°/ã¢ã³ãã¯ã·ã³ã°ãæäŸããïŒã¯ãç®åã®åé¡ããããªãããããã ãã®ãã€ãºã§ãã ç¶æ ãå¹æãªã©ãæ瀺ããããšã¯è¯ãããšã ãšæããŸããã䟿å©ãªã©ããã³ã°/æœè±¡åã¯ãŸã èŠã€ãã£ãŠããªããšæããŸãã ç§ãã¡ããããèŠã€ãããŸã§ãåŸæ¥ã®ããã°ã©ãã³ã°ãã¿ãŒã³ããµããŒãããããšã¯ããã®éã«å®éšãšæ¢çŽ¢ããããããšãªãé²ãæ¹æ³ã®ããã«æããŸãã
PSïŒã«ã¹ã¿ã æŒç®å以äžã®ãã®ãå¿ èŠã ãšæããŸãã å®çšçãªã¢ããã£ãã¯ã©ã€ãã©ãªã«ã¯ãããé«åºŠãªåãšããçš®ã®åã¯ã©ã¹ãäžå¯æ¬ ã§ãã ãã®äžã§ãç§ã¯æåã«HKTãè©äŸ¡ãã次ã«åã¯ã©ã¹ãè©äŸ¡ããŸãã ããã¯èšã£ãŠããTypeScriptã¯ãã®ãããªæŠå¿µãå®è·µããããã®èšèªã§ã¯ãªããšæããŸãã ããããåããŸã-ã¯ããããããã®å²åŠãšã«ãŒãã¯é©åãªã·ãŒã ã¬ã¹ãªçµ±åã®ããã«æ ¹æ¬çã«é ãã§ãã
OPã®è³ªåã«æ»ã- instanceof
ã¯äœ¿çšããã®ã«å±éºãªæŒç®åã§ãã ãã ããæ瀺çãªäŸå€ã¯Error
ã«éå®ãããŸããã ç¬èªã®ADTãŸãã¯ã«ã¹ã¿ã POJOãšã©ãŒãã¹ããŒããããšãã§ããŸãã ææ¡ãããæ©èœã¯éåžžã«äŸ¿å©ã§ããããã¡ãããããªã誀çšãããå¯èœæ§ããããŸãã ãããã«ãããããã¯é¢æ°ãããéæã«ããŸããããã¯ééããªãè¯ãããšã§ãã å
šäœãšããŠãç§ã¯ããã«50/50ã§ã:)
@ aleksey-bykov
éçºè
ã¯ãããªãã説æããããŸããŸãªjsã®åé¡ã«æ³šæããå¿
èŠããããŸããçµå±ãtypescriptã«throws
ãè¿œå ããŠããjsã«æ°ãããã®ã¯äœãå°å
¥ããããèšèªãšããŠã®typescriptã«æ¢åã®jsã®åäœãè¡šçŸããæ©èœããäžããããŸããã
ãµãŒãããŒãã£ã®ã©ã€ãã©ãªããšã©ãŒãã¹ããŒããå¯èœæ§ããããšããäºå®ã¯ããŸãã«ç§ã®ãã€ã³ãã§ãã
圌ãã®å®çŸ©ãã¡ã€ã«ã«ãããå«ãŸããŠãããšããããç§ã¯ãããç¥ãæ¹æ³ããããŸãã
@aluanhaddad
Error
ãæ¡åŒµããã®ã¯ãªãã²ã©ããã¿ãŒã³ãªã®ã§ããïŒ
@gcnew
instanceof
ã«ã€ããŠã¯ãããã¯åãªãäŸã§ãããç§ã¯ãã€ã§ãç°ãªãã¿ã€ãã®éåžžã®ãªããžã§ã¯ããã¹ããŒããã¿ã€ãã¬ãŒãã䜿çšããŠããããåºå¥ããããšãã§ããŸãã
ã¹ããŒããããšã©ãŒã®ã¿ã€ãã決å®ããã®ã¯éçºè
ã®è²¬ä»»ã§ããããããããã§ã«ãããªã£ãŠããŸãããçŸåšããããè¡šçŸããæ¹æ³ã¯ãããŸãããããããã®ææ¡ã§è§£æ±ºãããããšã§ãã
@nitzantomerãã€ãã£ãã¯ã©ã¹ã®ãµãã¯ã©ã¹åïŒ Error
ã Array
ã RegExp
ãªã©ïŒã¯ãå€ãECMAScriptããŒãžã§ã³ïŒES6ããåïŒã§ã¯ãµããŒããããŠããŸããã§ããã ãããã®ã¯ã©ã¹ã®ããŠã³ã¬ãã«ã®æŸåºã¯äºæããªãçµæãããããïŒæåã®åªåãæãããŸãããããã¯å¯èœãªéãã§ãïŒãæ¯æ¥å€ãã®åé¡ãèšé²ãããçç±ã§ãã çµéšåãšããŠãæè¿ã®ECMAScriptããŒãžã§ã³ãã¿ãŒã²ããã«ããŠããŠãå®éã«äœãããŠããã®ããç解ããŠããªãéãããã€ãã£ãããµãã¯ã©ã¹åããªãã§ãã ããã
@gcnew
ãããäœãæªãã£ãã®ããç解ããããã«æ°æé以äžè²»ãããã®ã§ãç§ã¯ãããããç¥ã£ãŠããŸãã
ããããä»ã¯ããããããšãã§ããã®ã§ãããããªãçç±ã¯ãªãã¯ãã§ãïŒes6ãã¿ãŒã²ããã«ããå ŽåïŒã
ãããã«ããããã®ææ¡ã¯ããŠãŒã¶ãŒãErrorã¯ã©ã¹ããµãã¯ã©ã¹åããããšãæ³å®ããŠããããåãªãäŸã«ãããŸããã
@nitzantomerææ¡ãError
ã«éå®ãããŠãããšäž»åŒµããŠããããã§ã¯ãããŸããã ãµãã¯ã©ã¹åããã®ãæªããã¿ãŒã³ã§ããçç±ã説æããŸããã ç§ã®æçš¿ã§ã¯ãã«ã¹ã¿ã ãªããžã§ã¯ããèå¥ãããå
±çšäœã䜿çšãããå¯èœæ§ããããšããã¹ã¿ã³ã¹ãå®éã«æè·ããŸããã
instanceof
ã¯å±éºã§ãããJavaScriptã®ç¹æ®æ§ãåãé€ãããšããŠããã¢ã³ããã¿ãŒã³ãšèŠãªãããŸããããšãã°ãinstanceofæŒç®åã«æ³šæããŠãã ããã ãã®çç±ã¯ãã³ã³ãã€ã©ãæ°ãããµãã¯ã©ã¹ã«ãã£ãŠå°å
¥ããããã°ãããŠãŒã¶ãŒãä¿è·ã§ããªãããã§ãã instanceof
ã䜿çšããããžãã¯ã¯å£ãããããå°æ°ã®ãªãã·ã§ã³ããæåŸ
ããªãããããªãŒãã³/ã¯ããŒãºã®ååã«åŸããŸããã ã¯ã€ã«ãã«ãŒãã±ãŒã¹ãè¿œå ãããå Žåã§ããæ°ãã掟çç©ã¯ãå·çæç¹ã§ã®ä»®å®ã«éåããå¯èœæ§ãããããããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
æ¢ç¥ã®éžæè¢ãåºå¥ãããå Žåã®ããã«ãTypeScriptã«ã¯ã¿ã°ä»ãå ±çšäœïŒèå¥ãããå ±çšäœãŸãã¯ä»£æ°çããŒã¿åãšãåŒã°ããŸãïŒããããŸãã ã³ã³ãã€ã©ãŒã¯ããã¹ãŠã®ã±ãŒã¹ãåŠçãããããšã確èªããŸããããã«ãããåªããä¿èšŒãåŸãããŸãã æ¬ ç¹ã¯ãã¿ã€ãã«æ°ãããšã³ããªãè¿œå ããå Žåããããèå¥ãããã¹ãŠã®ã³ãŒãã調ã¹ãŠãæ°ããè¿œå ããããªãã·ã§ã³ãåŠçããå¿ èŠãããããšã§ãã å©ç¹ã¯ããã®ãããªã³ãŒããå£ããŠããå¯èœæ§ãæãé«ãããšã§ãããå®è¡æã«å€±æããå¯èœæ§ããããŸãã
ç§ã¯ãã®ææ¡ãèãçŽããŠå察ã«ãªããŸããã ãã®çç±ã¯ã throws
宣èšã眲åã«ååšãããã匷å¶ãããŠããªãå Žåããããã¯ããã¥ã¡ã³ãã®ã³ã¡ã³ãã«ãã£ãŠãã§ã«åŠçã§ããããã§ãã 匷å¶ãããå ŽåãJavaScriptã«ã¯åä»ãcatchå¥ã«å¯ŸããJavaã®ã¡ã«ããºã ããªããããã€ã©ã€ã©ããŠããã«é£²ã¿èŸŒãŸããŠããŸããšããææ
ãå
±æããŸãã äŸå€ã®äœ¿çšïŒç¹ã«å¶åŸ¡ãããŒãšããŠïŒãã確ç«ãããæ
£è¡ã§ã¯ãããŸããã§ããã ããããã¹ãŠã¯ããã§ãã¯ãããäŸå€ããããããã®ãå°ãªãããããšãç解ããããšã«ã€ãªãããŸããã倱æãè¡šãããã®ããåªããçŸåšããäžè¬çãªæ¹æ³ãå©çšå¯èœã§ãïŒäŸïŒãŠããªã³ãªã¿ãŒã³ïŒã
@gcnew
ããã¯CïŒã§è¡ãããæ¹æ³ã§ããåé¡ã¯ãããã¥ã¡ã³ããtypescriptã®æšæºã§ã¯ãªãããšã§ãã
ååã«ææžåãããŠããå®çŸ©ãã¡ã€ã«ã«åºããããããšãèŠããŠããŸããã ããŸããŸãªlib.d.ts
ãã¡ã€ã«ã«ã¯ã³ã¡ã³ããå«ãŸããŠããŸãããã¹ããŒããããšã©ãŒã¯å«ãŸããŠããŸããïŒ1ã€ã®äŸå€ãé€ããŠïŒ lib.es6.d.ts
ã«ã¯Date[Symbol.toPrimitive](hint: string)
ã«1ã€ã®throws
ããããŸãïŒã
ãŸãããã®ææ¡ã§ã¯ããšã©ãŒã®æšæž¬ãèæ
®ãããŠããŸããããã¯ãããã¥ã¡ã³ãã®ã³ã¡ã³ããããšã©ãŒãçºçããå Žåã«ã¯çºçããŸããã æšæž¬ããããã§ãã¯æžã¿äŸå€ã䜿çšãããšãéçºè
ã¯throws
å¥ãæå®ããå¿
èŠãããããŸãããã³ã³ãã€ã©ã¯ãããèªåçã«æšæž¬ããã³ã³ãã€ã«ã«äœ¿çšããŠãçµæã®å®çŸ©ãã¡ã€ã«ã«è¿œå ããŸãã
ãšã©ãŒåŠçã匷å¶ããããšã¯è¯ãããšã§ã¯ãªãããšã«åæããŸããããã®æ©èœã䜿çšãããšãå¿
èŠãªäººã䜿çšã§ããæ
å ±ãè¿œå ãããã ãã§ãã
åé¡ïŒ
...倱æãè¡šãããã®ããè¯ããããŠçŸåšããäžè¬çãªæ¹æ³ããããŸã
ãããè¡ãããã®æšæºçãªæ¹æ³ããªããšããããšã§ãã
ãŠããªã³ãªã¿ãŒã³ã䜿çšããå ŽåããããŸãã@ aleksey-bykovã¯Tried<>
ã䜿çšããå¥ã®ãµãŒãããŒãã£ã©ã€ãã©ãªã®éçºè
ã¯ãŸã£ããç°ãªãããšãè¡ããŸãã
ãšã©ãŒã®ã¹ããŒã¯ãèšèªïŒjsãjavaãcïŒ...ïŒå
šäœã®æšæºã§ãããã·ã¹ãã ã®äžéšã§ãããåé¿çã§ã¯ãªããããïŒç§ã®æèŠã§ã¯ïŒtypescriptã§ã®åŠçãåªããŠããã¯ãã§ããããã®èšŒæ ã¯ãã®æ°ã§ãã catch
å¥ã§åã®æ³šéãèŠæ±ããåé¡ã®ããã€ãã
é¢æ°ïŒãŸãã¯åŒã³åºãããé¢æ°ïŒãã¹ããŒã§ããå Žåã¯ãVSã®ããŒã«ãããã«æ
å ±ãå
¥ããããšæããŸãã *.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;
}
}
}
ããããªããšãçºä¿¡è ãäœãçãããšãã§ããããç¥ã£ãŠããã«ãããããããæããã°ããã®ã³ãŒãã䜿çšããŠç¶è¡ããŠãå®å šã§ãããšããä¿èšŒã圌ãã«äžããããšã¯ã§ããŸãã
ãããã£ãŠãèªåãã§ãã¯ãããäŸå€å¥çŽã®äŒæãªã©ã¯ãããŸããã
ç§ãééã£ãŠããå Žåã¯èšæ£ããŠãã ãããããã¯ãŸãã«Javaãè¡ãããšã§ãããåã«äŸãšããŠèª¬æããŸããã
@ aleksey-bykov
ãã®ïŒ
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? */
@ aleksey-bykov
ã§ã¯ããã¹ãŠã®ãšã©ãŒãJavaã®å Žåãšåãããã«åŠçããå¿
èŠããããšææ¡ããŸããïŒ
js / tsã¯ã¯ããã«åçã§ããããŠãŒã¶ãŒã¯ããã«æ
£ããŠããã®ã§ãç§ã¯ãã®ãã¡ã³ã§ã¯ãããŸããïŒç§ã¯Javaããæ¥ãŠããŸã ãããæããŠããŸããïŒã
ã³ã³ãã€ã«æã«ãšã©ãŒãå«ãããšããšã©ãŒã«å¯ŸåŠããããã®ãã©ã°ã«ãªãå¯èœæ§ããããŸãïŒ strictNullChecks
ãªã©ïŒã
ç§ã®ææ¡ã¯ãæªåŠçã®äŸå€ã解決ããããã®ãã®ã§ã¯ãããŸãããæçš¿ããã³ãŒãã¯ããã®æ©èœãå®è£
ããªããšå£ããŠããŸããjsã§ãå£ããŠããŸããŸãã
ç§ã®ææ¡ã¯ãéçºè
ãšããŠãã¹ããŒãããå¯èœæ§ã®ããããŸããŸãªãšã©ãŒãããèªèã§ããããã«ããã ãã§ããããããåŠçãããç¡èŠãããã¯ããŸã ããªã次第ã§ãã
ãŒãé€ç®ã®åé¡ã«ã€ããŠã¯ããšã©ãŒã¯çºçããŸããã
console.log(1 / 0) // Infinity
console.log(1 / "hey!") // NaN
ã¹ããŒãããå¯èœæ§ã®ããããŸããŸãªãšã©ãŒãããããèªèããŸã
圌ãããããã«å¯ŸåŠã§ããªãéãããããæå³ã¯ãããŸãããç§ããªã¹ãããã±ãŒã¹ã®ããã«çŸåšã®ææ¡ã¯å®è¡å¯èœã§ã¯ãããŸãã
ã§ã¯ããã¹ãŠã®ãšã©ãŒãJavaã®å Žåãšåãããã«åŠçããå¿ èŠããããšææ¡ããŸããïŒ
ã¯ããããã¯äŸå€ããã§ãã¯ããããšã®æå³ã§ã
@ aleksey-bykov
ããªãããªã¹ãããã±ãŒã¹ã®ããããããã®ææ¡ãå®è¡äžå¯èœã«ããçç±ãããããŸããã
DivisionByZero
ãã¹ããŒãããšæšæž¬ãããé¢æ°ã䜿çšããŠããå Žåã§ãïŒã¹ããŒãããå Žæã«é¢ä¿ãªãïŒãåŒã³åºããã§ãŒã³ã®ãã£ãšäžã«ã¹ããŒããããšã©ãŒã®åŠçã«åé¡ã¯ãããŸããããããåŠçããããšãéžæã§ããŸãã ã
ããŸããŸãªåŒæ°ã䜿çšããŠåè©Šè¡ã§ããŸããåé¡ãçºçãããšããã¡ãã»ãŒãžããŠãŒã¶ãŒã«è¡šç€ºã§ããŸãããã®åé¡ããã°ã«èšé²ããŠãåŸã§ã³ãŒããå€æŽããŠåŠçã§ããããã«ããããšãã§ããŸãïŒé »ç¹ã«çºçããå ŽåïŒã
ç¹°ãè¿ãã«ãªããŸããããã®ææ¡ã¯å®è¡æã«äœãå€æŽãããªããããæ©èœãããã®ã¯ãã¹ãŠä»¥åãšåãããã«æ©èœãç¶ããŸãã
å¯äžã®éãã¯ãã¹ããŒãããå¯èœæ§ã®ãããšã©ãŒã«é¢ãã詳现æ
å ±ãããããšã§ãã
ç§ã¯ããªããèšã£ãŠããããšãç解ããŠããŸããjavascriptã®å®è¡æã«äœãå€æŽãããŸããããããã§ã®ããªãã®ã¡ãã»ãŒãžã¯ããŠãŒã¶ãŒã20å±€äžããæ¥ãäŸå€ãåãèªä¿¡ãæã£ãŠåŠçããããšã«ãã£ãŠåœŒããäœãããŠããããç¥ã£ãŠãããšããå¹»æ³ããŠãŒã¶ãŒã«äžããããšã§ã圌ãã¯å³æã®äŸå€ãåŠçããŸã
20å±€äžã§çºçããåé¡ãä¿®æ£ããæ¹æ³ã¯ãããŸããã
ãã§ãã¯ãããŠããªãäŸå€ãšåãããã«ããã°ã«èšé²ããããšã¯ã§ããŸãããä¿®æ£ããããšã¯ã§ããŸããã
ã§ããããäžè¬çã«èšã£ãŠåã§ããTSã«ã¯ååãªåããããŸãã人ã ãããã«æ··ä¹±ãããªãããã«ããŸãããã
@ aleksey-bykov
ããªãã説æããŠããããšã¯ãäŸå€ããµããŒããããã¹ãŠã®èšèªã«ååšããŸãã
äŸå€ããã£ããããããšã§åé¡ã解決ãããšã¯èª°ãèšããŸããã§ããããåé¡ãé©åã«åŠçã§ããããã«ãªããŸãã
é¢æ°ãåŒã³åºããšãã«ã¹ããŒãããå¯èœæ§ã®ãããšã©ãŒãç¥ãããšã¯ãéçºè ãåŠçã§ãããšã©ãŒãšåŠçã§ããªããšã©ãŒãåºå¥ããã®ã«åœ¹ç«ã¡ãŸãã
ä»ã®ãšãããéçºè
ã¯JSON.parse
ã䜿çšãããšãšã©ãŒãçºçããå¯èœæ§ãããããšãç¥ããªããããããŸãããããããlib.d.ts
ã®äžéšã§ãããIDEãïŒããšãã°ïŒåœŒã«éç¥ããå Žåã¯ããããã圌ã¯ãã®å ŽåãåŠçããŸãã
å éšç¶æ ã19å±€ã§ç ŽæããŠãããç¶æ ããã©ã€ããŒãã§ããããã«ããã«è¡ãããšãã§ããªãããã20å±€äžã§çºçããåé¡ãé©åã«åŠçã§ããŸããã
建èšçã§ããããã«ïŒç§ãææ¡ããŠããã®ã¯ããŠãŒã¶ãŒããã§ãã¯ãããäŸå€ãããã«åŠçããæ瀺çã«åã¹ããŒããããšãèŠæ±ããããšã§ãããã®ããã«ããŠãæå³ããªãæ··ä¹±ãæé€ãããã§ãã¯ãããäŸå€ããã§ãã¯ãããŠããªããã®ããåé¢ããŸãã
$ïŒ$ JSON.parse
$ïŒ$ã®SyntaxError
ã¯ããã§ãã¯ãããäŸå€ãšããŠå®£èšããå¿
èŠããããŸã
@ aleksey-bykov
éçºè ã«ã圌ããæãŸãªãããšã圌ããä»ãŸã§è¡ã£ãŠããªãããšãããããã«åŒ·å¶ããå¿ èŠãããçç±ãããããŸããã
次ã«äŸã瀺ããŸãã
ãŠãŒã¶ãŒãjsonããŒã¿ãæžã蟌ãã ã貌ãä»ãããããŠããã¿ã³ãã¯ãªãã¯ã§ããWebã¯ã©ã€ã¢ã³ãããããŸãã
ã¢ããªã¯ãã®å
¥åãåãåãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã«æž¡ããŸãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã¯ããã®jsonãäœããã®æ¹æ³ã§è§£æããããŸããŸãªã¿ã€ãã®å€ïŒæååãæ°å€ãããŒã«å€ãé
åãªã©ïŒãšãšãã«jsonãè¿ããŸãã
ãã®ãµãŒãããŒãã£ã©ã€ãã©ãªãSyntaxError
ãã¹ããŒããå Žåãå埩ã§ããŸããå
¥åãç¡å¹ã§ãããåè©Šè¡ããå¿
èŠãããããšããŠãŒã¶ãŒã«éç¥ããŸãã
é¢æ°ãåŒã³åºããšãã«ã¹ããŒãããå¯èœæ§ã®ãããšã©ãŒãç¥ãããšã«ãããéçºè
ã¯åŠçã§ãããã®ãšåŠçããããªããã®ã決å®ã§ããŸãã
ãšã©ãŒãã¹ããŒããããã§ãŒã³ã®æ·±ãã¯é¢ä¿ãããŸããã
ããªãã¯ç§ãèšã£ãŠããããšãç解ããŠããªãããã§ããç§ãã¡ã¯èŒªã«ãªã£ãŠè¡ããŸã
ãµãŒãããŒãã£ã®ã©ã€ãã©ãªããSyntaxError
ã¹ããŒãããããšã§ãã«ãã»ã«åãããŠããã¯ãã®ç¬èªã®ã³ãŒãã®å®è£
ã®è©³çŽ°ã«ãŠãŒã¶ãŒãå
¬éããŸãã
åºæ¬çã«ããªãã¯èšã£ãŠããŸãããããããã¯ç§ã®ã³ãŒãã§ã¯ãããŸãããããã¯ç§ãã€ã³ã¿ãŒãããã§èŠã€ããŠäœ¿çšãããã®æããªã©ã€ãã©ãªã§ããããã§ããªããããã«åé¡ããããªããç§ã§ã¯ãªããã®ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãæ±ã£ãŠãã ãããç§ç§ãæ±ããããããšãèšã£ã
ãŸããSyntaxErrorã®åŸã§ãã®ãµãŒãããŒãã£ã®ã€ã³ã¹ã¿ã³ã¹ãåŒãç¶ã䜿çšã§ãããšããä¿èšŒã¯ãããŸãããããšãã°ãã¹ããŒããåŸã«ãµãŒãããŒãã£ã®ã³ã³ãããŒã«ãåã€ã³ã¹ã¿ã³ã¹åããããšã«ããããŠãŒã¶ãŒã«ä¿èšŒãæäŸããã®ã¯ãŠãŒã¶ãŒã®è²¬ä»»ã§ãã
çµè«ãšããŠãããªãã¯å éšã®äŸå€ãåŠçãã責任ãè² ãå¿ èŠããããŸãïŒãããã®ãã¹ãŠã§ã¯ãªãããã§ãã¯ããããã®ã ãã§ãããé¡ãããŸãïŒ
ç§ã¯ããªããèšã£ãŠããããšãç解ããŠããŸãããç§ã¯ããã«åæããŸããã
ããã§ããããã¯åºæ¬çã«ç§ãèšã£ãŠããããšã§ãã
ãšã©ãŒãã¹ããŒãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããå Žåã¯ããããåŠçãããç¡èŠããŠãã³ãŒãã®ãŠãŒã¶ãŒã«åŠçãããããéžæã§ããŸãã
ãããè¡ãçç±ã¯ãããããããŸããããšãã°ãç§ãæžããŠããlibã¯UIã«äŸåããªããããäœããééã£ãŠããããšããŠãŒã¶ãŒã«éç¥ããããšã¯ã§ããŸããããç§ã®libã䜿çšãã人ã¯ã䜿çšæã«ã¹ããŒããããšã©ãŒãåŠçã§ããŸããç§ã®libãšãŠãŒã¶ãŒãšå¯Ÿè©±ããããšã«ãã£ãŠããããåŠçããŸãã
ã©ã€ãã©ãªãã¹ããŒããããšãã«ç Žæããç¶æ
ã®ãŸãŸã«ãªã£ãŠããå Žåã¯ããããããããææžåããå¿
èŠããããŸãã
ãã®åŸããã®ãããªã©ã€ãã©ãªã䜿çšãããã®çµæããšã©ãŒãçºçããå Žåãç¶æ
ãç Žæããææžåããå¿
èŠããããŸãã
çµè«ïŒ
ãã®ææ¡ã¯ãã¹ããŒããããšã©ãŒã«é¢ãã詳现æ
å ±ãæäŸããããã«ãªããŸãã
éçºè
ã«å¥ã®æ¹æ³ã§ç©äºãè¡ãããã«åŒ·å¶ããã¹ãã§ã¯ãããŸãããå¿
èŠã«å¿ããŠãéçºè
ããšã©ãŒã«å¯ŸåŠããããããã ãã§ãã
åæã§ããªãå ŽåããããŸãããåé¡ãããŸããããã§ãã¯ãããäŸå€ãšã¯åŒã°ãªãã§ãã ããããã§ãã¯ãããäŸå€ãšã¯ç°ãªãããã§ãã
ããªããæ°ã«ããã®ã¯éçºè ã«ããããèªèãããããšã ããªã®ã§ããããããªã¹ããããããŸãã¯æããã«ãããäŸå€ãšåŒã³ãŸããã
@ aleksey-bykov
ååã«å
¬å¹³ã§ãååãå€æŽãããŸããã
@ aleksey-bykov
å éšç¶æ ã19å±€ã§ç ŽæããŠãããç¶æ ããã©ã€ããŒãã§ããããã«ããã«è¡ãããšãã§ããªãããã20å±€äžã§çºçããåé¡ãé©åã«åŠçã§ããŸããã
ããããå éšç¶æ ãä¿®æ£ããããšã¯ã§ããŸããããããŒã«ã«ç¶æ ãä¿®æ£ããããšã¯ã§ããŸããããããŸãã«ããã§ã®åŠçã®ãã€ã³ãã§ãããã¹ã¿ãã¯ã®å¥¥æ·±ãã§ã¯ãããŸããã
äŸå€ãåŠçãããšãã«äžéšã®å ±æå¯å€å€ãã©ã®ãããªç¶æ ã«ãããã確èªããæ¹æ³ããªããšããè°è«ã®å Žåãããã¯åœä»€åããã°ã©ãã³ã°ã«å察ããè°è«ã§ããããã®ææ¡ã«éå®ãããŸããã
ãã¹ãŠã®ã¬ã€ã€ãŒããäžã®ã¬ã€ã€ãŒããããã«çºçããäŸå€ã«å¯Ÿå¿ãã責任ãè² ãå¿ èŠãããå Žåãæ£åžžã«å埩ããå¯èœæ§ãã¯ããã«é«ããªããŸããããã¯ããã§ãã¯ãããäŸå€ã®èåŸã«ããèãæ¹ã§ãã
å¥ã®èšãæ¹ãããã°ã1ã¬ãã«ä»¥äžäžããæ¥ãäŸå€ã¯æã§ããããã¹ãŠã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããŒãããåã€ã³ã¹ã¿ã³ã¹åãã以å€ã®ããšãè¡ãã«ã¯é ãããŸãïŒéãè¯ããã°ãã°ããŒãã«ãªæ®ãç©ã¯ãããŸããïŒ tãªãŒãïŒ
ããªãã®æã®å±ããªããšããã«äœãæªãããšãèµ·ãã£ããšããç¥èã«åå¿ããä¿¡é Œã§ããæ¹æ³ããªãã®ã§ãè¿°ã¹ãããææ¡ã¯ã»ãšãã©åœ¹ã«ç«ããªã
ããã¯çŽ æŽãããã FWIWïŒè¿œå ãããå Žåãããã©ã«ãã§ã¹ããŒã¡ãœãããåŠçããããã¡ãœããã«ã¹ããŒãšããŠããŒã¯ãä»ããå¿ èŠããããšæããŸãã ãã以å€ã®å Žåã¯ãã»ãšãã©ããã¥ã¡ã³ãã«ãããŸããã
@agonzalezjr
ã¿ã€ãã¹ã¯ãªããã®ã»ãšãã©ã®æ©èœãšåæ§ã«ããã®æ©èœã§ããªããã€ã³ã§ããã¯ãã ãšæããŸãã
ã¿ã€ããè¿œå ããããšãå¿
é ã§ã¯ãªãã®ãšåãããã«ãã¹ããŒ/ãã£ããããå¿
èŠã¯ãããŸããã
--onlyCheckedExceptions
ã®ããã«ããããå¿
é ã«ãããã©ã°ãããã¯ãã§ãã
ãããã«ããããã®æ©èœã¯ãããã¥ã¡ã³ãã®ããã ãã§ãªããã¹ããŒãããäŸå€ã®ã¿ã€ããæšæž¬/æ€èšŒããããã«ã䜿çšãããŸãã
@nitzantomer
次ã«äŸã瀺ããŸãã
ãŠãŒã¶ãŒãjsonããŒã¿ãæžã蟌ãã ã貌ãä»ãããããŠããã¿ã³ãã¯ãªãã¯ã§ããWebã¯ã©ã€ã¢ã³ãããããŸãã
ã¢ããªã¯ãã®å ¥åãåãåãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã«æž¡ããŸãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã¯ããã®jsonãäœããã®æ¹æ³ã§è§£æããããŸããŸãªã¿ã€ãã®å€ïŒæååãæ°å€ãããŒã«å€ãé åãªã©ïŒãšãšãã«jsonãè¿ããŸãã
ãã®ãµãŒãããŒãã£ã©ã€ãã©ãªãSyntaxErrorãã¹ããŒããå Žåãå埩ã§ããŸããå ¥åãç¡å¹ã§ãããåè©Šè¡ããå¿ èŠãããããšããŠãŒã¶ãŒã«éç¥ããŸãã
ããã¯ç¢ºãã«ããã§ãã¯ãããäŸå€ã®å
šäœåãææ§ã«ãªãé åã®1ã€ã§ãã ãŸãã_äŸå€çãªç¶æ³_ã®å®çŸ©ãäžæ確ã«ãªãå Žæã§ããããŸãã
ãã®äŸã®ããã°ã©ã ã¯ããã§ãã¯ãããäŸå€ãã¹ããŒãããã®ãšããŠå®£èšãããŠããJSON.parse
ã®åŒæ°ã«ãªããŸãã
ããããããã°ã©ã ãHTTPã¯ã©ã€ã¢ã³ãã§ãããäžæ£ãªåœ¢åŒã®æ¬æãå«ãŸããŠããHTTPå¿çã«æ·»ä»ãããããããŒã®å€ã«åºã¥ããŠJSON.parse
ãåŒã³åºããŠããå Žåã¯ã©ããªãã§ããããã ããã°ã©ã ãå埩ããããã«ã§ããæå³ã®ããããšã¯äœããããŸãããããã°ã©ã ãã§ããããšã¯ãåã¹ããŒããããšã ãã§ãã
ããã¯ã JSON.parse
ããã§ãã¯æžã¿ãšããŠå®£èšãããããšã«å察ããè°è«ã ãšæããŸãã
ããã¯ãã¹ãŠãŠãŒã¹ã±ãŒã¹ã«äŸåããŸãã
ããã¯ãã©ã°ã®äžã«ãããšææ¡ãããŠãããšã®ããšã§ããããã®æ©èœã䜿çšããããšèããŠããã©ã°ãæå¹ã«ããŸããã ç§ãæžããŠããããã°ã©ã ã®çš®é¡ã«å¿ããŠãããã¯ç§ãå©ããã劚ããããããããããŸããã
åŸæ¥ã®java.io.FileNotFoundExceptionã§ããããã®äŸã§ãã ãã§ãã¯ãããŠããŸãããããã°ã©ã ã¯å埩ã§ããŸããïŒ ããã¯å®éã«ã¯ãæ¬ èœããŠãããã¡ã€ã«ãåŒã³åºãå ã§ã¯ãªãåŒã³åºãå ã«ãšã£ãŠäœãæå³ãããã«äŸåããŸãã
@aluanhaddad
ãã®ææ¡ã¯ãæ°ããæ©èœãè¿œå ããããšãææ¡ãããã®ã§ã¯ãªããjavascriptã«ãã§ã«ååšãããã®ãtypescriptã§è¡šçŸããæ¹æ³ãè¿œå ããããšã ããç®çãšããŠããŸãã
ãšã©ãŒãã¹ããŒãããŸãããçŸåšãtypescriptã«ã¯ãšã©ãŒã宣èšããæ¹æ³ããããŸããïŒã¹ããŒãŸãã¯ãã£ããããå ŽåïŒã
ããªãã®äŸã®ããã«ããšã©ãŒããã£ããããããšã«ãã£ãŠãããã°ã©ã ã¯ãã®ãšã©ãŒããã£ããããããšã«ãã£ãŠãæ£åžžã«ã倱æããå¯èœæ§ããããŸãïŒããšãã°ããŠãŒã¶ãŒã«ãäœããããŸããããŸããã§ãããã¡ãã»ãŒãžã衚瀺ããŸãïŒããŸãã¯ããã°ã©ã /éçºè
ã«ãã£ãŠã¯ç¡èŠã§ããŸãã
ããã°ã©ã ã®ç¶æ
ããã®ãšã©ãŒã®åœ±é¿ãåããå¯èœæ§ãããå ŽåããããåŠçãããšãå£ããç¶æ
ã§ã¯ãªãæå¹ãªç¶æ
ãç¶æã§ããŸãã
ãããã«ãããéçºè
ã¯ãã¹ããŒããããšã©ãŒããå埩ã§ãããã©ããã確èªããå¿
èŠããããŸãã
ãŸããå埩ããããšã®æå³ã決å®ããã®ã圌ã®è²¬ä»»ã§ããããšãã°ããã®httpã¯ã©ã€ã¢ã³ãããµãŒãããŒãã£ã®ã©ã€ãã©ãªãšããŠäœ¿çšããããã«äœæããŠããå Žåãã©ã€ãã©ãªããã¹ããŒããããã¹ãŠã®ãšã©ãŒãåãã¿ã€ãã«ããããšãã§ããŸãã
enum ErrorCode {
IllFormedJsonResponse,
...
}
...
{
code: ErrorCode;
message: string;
}
ããã§ãã©ã€ãã©ãªã§JSON.parse
ã䜿çšããŠå¿çã解æãããšãã«ãã¹ããŒããããšã©ãŒããã£ããããŠãããç¬èªã®ãšã©ãŒãã¹ããŒããããšæããŸãã
{
code: ErrorCode.IllFormedJsonResponse,
message: "Failed parsing response"
}
ãã®æ©èœãå®è£ ãããŠããå Žåããã®åäœã宣èšããã®ã¯ç°¡åã§ãããã©ã€ãã©ãªã®ãŠãŒã¶ãŒã«ã¯ããã®æ©èœãã©ã®ããã«æ©èœãã倱æããããæ確ã«ãªããŸãã
ãã®ææ¡ã¯ãæ°ããæ©èœãè¿œå ããããšãææ¡ãããã®ã§ã¯ãªããjavascriptã«ãã§ã«ååšãããã®ãtypescriptã§è¡šçŸããæ¹æ³ãè¿œå ããããšã ããç®çãšããŠããŸãã
ç¥ã£ãŠããã ç§ã¯TypeScriptããã®ææ¡ã®äžã§çºããã§ããããšã©ãŒã«ã€ããŠè©±ããŠããã
ç§ã®ä»®å®ã§ã¯ããã®ææ¡ã¯ãåãã§ãã¯ã®ç®çã§ã®ã¿ããã§ãã¯ãããäŸå€æå®åãšãã§ãã¯ãããŠããªãäŸå€æå®åïŒæšè«ãŸãã¯æ瀺çïŒã®åºå¥ãæ瀺ããŠããŸããã
@aluanhaddad
åã®ã³ã¡ã³ãã§ããªããèšã£ãããšïŒ
ããããããã°ã©ã ãHTTPã¯ã©ã€ã¢ã³ãã§ãããäžæ£ãªåœ¢åŒã®æ¬æãå«ãŸããŠããHTTPå¿çã«æ·»ä»ãããããããŒã®å€ã«åºã¥ããŠJSON.parseãåŒã³åºããŠããå Žåã¯ã©ããªãã§ããããã ããã°ã©ã ãå埩ããããã«ã§ããæå³ã®ããããšã¯äœããããŸãããããã°ã©ã ãã§ããããšã¯ãåã¹ããŒããããšã ãã§ãã
é¢æ°ãçµæãè¿ãããã«å®£èšããããšãã«null
ãè¿ãå Žåã«ãåãããã«é©çšãããŸãã
éçºè
ãstrictNullChecks
ã䜿çšããããšãéžæããå Žåãé¢æ°ãïŒã¹ããŒãã代ããã«ïŒ null
ãè¿ãå Žåãåãã·ããªãªã§ãããã°ã©ã ãå®è¡ã§ããæå³ã®ãããã®ã¯äœããããŸããããšãŸã£ããåãããšãèšãããšãã§ããŸããå埩ãã"ã
ãã ãã onlyCheckedExceptions
ãã©ã°ã䜿çšããªããŠãããã®æ©èœã¯åŒãç¶ã圹ç«ã¡ãŸããããšãã°ãé¢æ°ãError
ã®ã¿ãã¹ããŒããããã«å®£èšãããŠãããšãã«ããšã©ãŒãstring
ãšããŠãã£ããããããšãããšãã³ã³ãã€ã©ãæå¥ãèšãããã§ãã Error
ã
ããã¢ã€ãã¢ã§ãããã¹ããããåŒã³åºããããªãã«äœãæããããããç¥ãæ¹æ³ããªãã®ã§ãããã¯åœ¹ã«ç«ã¡ãŸãããå³å¯/ã¿ã€ãã»ãŒãã§ã¯ãããŸããã
ã€ãŸããã¿ã€ãAã®äŸå€ãã¹ããŒããå¯èœæ§ã®ããé¢æ°ããããããã®å
éšã§ãã¹ããããé¢æ°ãåŒã³åºããtry catchã«å
¥ããªãå Žåãã¿ã€ãBã®äŸå€ãåŒã³åºãå
ã«ã¹ããŒãããŸãã
ãããã£ãŠãåŒã³åºãå
ãã¿ã€ãAã®äŸå€ã®ã¿ãäºæããŠããå Žåããã¹ããããäŸå€ããä»ã®ã¿ã€ããååŸããªããšããä¿èšŒã¯ãããŸããã
ïŒã¹ã¬ãããé·ãããã®ã§ããã®ã³ã¡ã³ããèŠéããå Žåã¯ç³ãèš³ãããŸããïŒ
@shaipetel
åœé¡ã¯ãã³ã³ãã€ã©ãæªåŠçã®ãšã©ãŒã®ã¿ã€ããæšæž¬ããããããé¢æ°/ã¡ãœããã®ã·ã°ããã£ã«è¿œå ãããšè¿°ã¹ãŠããŸãã
ãããã£ãŠãããªãã説æããå Žåã B
ãåŠçãããªãã£ãå Žåãé¢æ°ã¯A | B
ãã¹ããŒããŸãã
ãããªãã»ã©ã åŒã³åºããã¹ãŠã®ã¡ãœãããããªã«ããŠã³ããŠãèãããããã¹ãŠã®äŸå€ã¿ã€ããåéããŸããïŒ
å¯èœã§ããã°ããããèµ·ããã®ãèŠããã§ãã åç
§ããŠãã ãããéçºè
ã¯ã宣èšãããªãäºæããªãäŸå€ãåžžã«çºçãããå¯èœæ§ããããŸãããã®å Žåãããªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹ã«èšå®ãããŠããªãããŸãã¯ã0ã§é€ç®ãããŸãã¯åæ§ã®äŸå€ãã»ãšãã©ãã¹ãŠã®é¢æ°ããåžžã«çºçããå¯èœæ§ããããŸãã
ç§èŠã§ã¯ããã¹ãŠã®äŸå€ãã¡ãã»ãŒãžãæã€åºæ¬ã¯ã©ã¹ããç¶æ¿ãããã©ãããããŠããªãããã¹ãããã®ä»ã®ãªããžã§ã¯ããã¹ããŒããããšããŸã£ããèš±å¯ããªãCïŒã®ããã«åŠçããã®ãæé©ã§ããã åºæ¬ã¯ã©ã¹ãšç¶æ¿ãããå Žåã¯ããã£ãããã«ã¹ã±ãŒãããŠããããããã¯ã§äºæ³ããããšã©ãŒãåŠçããå¥ã®ãããã¯ã§äºæããªããšã©ãŒãåŠçããããšãã§ããŸãã
@shaipetel
javascriptã§ã¯ããã¹ãŠã®ãšã©ãŒã¯Error
ã¯ã©ã¹ã«åºã¥ããŠããŸããããšã©ãŒã®ã¹ããŒã«å¶éãããŠããããã§ã¯ãªããäœã§ãã¹ããŒã§ããŸãã
throw "something went wrong"
throw 0
throw { message: "something went wrong", code: 4 }
ãããç§ã¯JavaScriptãã©ã®ããã«æ©èœããããç¥ã£ãŠããŸããç§ãã¡ã¯ãããªãå¶éã課ãTypeScriptã«ã€ããŠè°è«ããŠããŸãã
ç§ãææ¡ããã®ã¯ãIMHOã®è¯ã解決çã¯ãTypeScriptãäŸå€åŠçã«åŸãããã«ããããšã§ãããã®äŸå€åŠçã§ã¯ãã¹ããŒããããã¹ãŠã®äŸå€ãç¹å®ã®åºæ¬ã¯ã©ã¹ã§ãããã©ãããããŠããªãå€ãçŽæ¥ã¹ããŒã§ããªãããã«ããå¿
èŠããããŸãã
ãããã£ãŠããthrow0ããŸãã¯ãthrow'someerror 'ãã¯èš±å¯ãããŸããã
JavaScriptãèš±å¯ããã®ãšåãããã«ãTypeScriptã¯èš±å¯ããŸããã
ããããšãã
@nitzantomer
é¢æ°ãçµæãè¿ãããã«å®£èšãããŠããå Žåã«nullãè¿ãå Žåã«ãåãããšãé©çšãããŸãã
éçºè ãstrictNullChecksã䜿çšããããšãéžæããå Žåãé¢æ°ãïŒã¹ããŒãã代ããã«ïŒnullãè¿ãå Žåãåãã·ããªãªã§ãããã°ã©ã ãå埩ããããã«å®è¡ã§ããæå³ã¯ãããŸããããšãŸã£ããåãããšãèšãããšãã§ããŸãã
ãã ããonlyCheckedExceptionsãã©ã°ã䜿çšããªããŠãããã®æ©èœã¯åŒãç¶ã圹ç«ã¡ãŸããããšãã°ãé¢æ°ãErrorã®ã¿ãã¹ããŒããããã«å®£èšãããŠãããšãã«ããšã©ãŒãæååãšããŠãã£ããããããšãããšãã³ã³ãã€ã©ãæå¥ãèšãããã§ãã
ç§ã¯ããªããèšã£ãŠããããšãç解ããŠããŸããããã¯çã«ããªã£ãŠããŸãã
@shaipetelã¯ããã®ææ¡ãä»ã®å Žæã§åè¿°ããããã«ã Error
ãArray
ãªã©ã®çµã¿èŸŒã¿é¢æ°ã®ãµãã¯ã©ã¹åã¯æ©èœããŸããã ããã«ãããåºã䜿çšãããŠããå®è¡æéãšã³ã³ãã€ã«ã¿ãŒã²ããéã§ç°ãªãåäœãçºçããŸãã
ããŸããŸãªéãšã©ãŒã¿ã€ãã®å€ããã£ããããããšã¯ã2ã€ãææ¡ãããæ©èœãæ³å®ããæãå®è¡å¯èœãªæ¹æ³ã§ãã å®éããã®æ©èœãå©çšããäŸå€äŒæã¡ã«ããºã ããã¹ã¿ãã¯ãã¬ãŒã¹ããã®ä»ã®ãšã©ãŒåºæã®ããããã£ãããã¯ããã«å
·äœçã§ãã¯ããã«åœ¹ç«ã€ãšã©ãŒãåŒãèµ·ããå¯èœæ§ããããããåé¡ãšããŠã¯ããããŸããã
Error
ãæ¡åŒµããããšã¯å®è¡å¯èœã§ã¯ãããŸããã es2015æªæºã®ãã¹ãŠã®ã¿ãŒã²ããã䜿çšãããªããªããŸã§å®è¡ã§ããŸããã
ãã®ææ¡ãéæ¥çã«Error
é¢æ°ã®ãµãã¯ã©ã¹åã«ã€ãªããå Žåãããã¯æªãèãã ãšæããŸãã ãã®ãããªç°è°ã¯ãå¶åŸ¡ãããŒã®äŸå€ã®äœ¿çšãäŸå€çãªç¶æ³ã®å®çŸ©ã«é¢ããå²åŠçãªç°è°ãšã¯å®å
šã«å¥ã®ãã®ã§ãã ãããã£ãŠããã®ææ¡ãæ¡çšãããå Žåãæ£ãã䜿çšæ³ãšError
ã®ãµãã¯ã©ã¹åãåé¿ããå¿
èŠæ§ã«é¢ããéåžžã«å€§å£°ã§ããªãã®é¡ã®ããã¥ã¡ã³ããæåŸ
ããŸãã
åä»ãäŸå€ãåŠçããããã®ããçš®ã®ãã«ããŒããžãã¯ãããããšãæãã§ããŸããasync/ awaitã䜿çšããããã«å€ãã®promiseã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠããŸããããã¯çŸåšæ¬¡ã®ããã«ãªã£ãŠããŸãã
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
typescriptãããªãã®ææ¡ããµããŒãããŠããããªãããã欲ããã®ã§ãããç§ã®æèŠã§ã¯ãã®åé¡ãšã¯é¢ä¿ãããŸããã
ããªããææ¡ããŠããããšã¯ããã®åé¡ãäœã§ããããå®è£
ããã«å®è£
ããããšãã§ããŸããã³ã³ãã€ã©ãïŒããšãã°ïŒ NotFoundError
ãã¹ããŒãããªããšæå¥ãèšãããšãã§ããªããšããã ãã§ãã
ããã¯ã¿ã€ãããããã£ããã®ææ¡ã§ããããããªãçš®é¡ã®åé¡ã§ããªããšæããŸãããã¹ã¬ãããè€è£œããããªãã£ãã®ã§ããããç¬èªã®åé¡ã§æçš¿ããŸãã
@grofit
åæå®ããããã£ãããæ©èœèŠæ±ã®äžéšã§ãããé¢æ°ããã¹ããŒãããå¯èœæ§ã®ãããšã©ãŒã®ã¿ã€ããã³ã³ãã€ã©ãŒã«éç¥ããæ©èœããããŸãïŒãããŠãã³ã³ãã€ã©ãŒã¯ã¹ããŒãããå¯èœæ§ã®ãããšã©ãŒã®ã¿ã€ããæšæž¬ããããšãã§ããŸãïŒã
ç§ã®æèŠã§ã¯ãã¿ã€ãããããã£ããã¯ä»ã®éšåãªãã§å®è£ ããããšãã§ããŸãã æ°ããåé¡ãéããŠãã ãããå€åTSããŒã ã¯ãããéè€ãšããŠããŒã¯ããããšã決å®ããã§ããããç§ã¯ç¥ããŸããã
@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); })
ãããã®å ŽåãErroré¢æ°ãæž¡ãã instanceof
ã§å®è£
ãããå¯èœæ§ããããŸãã ãã®ãããªã³ãŒãã¯ãéåžžã«æªãããšã§ããError
ã®æ¡åŒµãä¿é²ãããããææ¯ã§ãã
@nitzantomerç§ã¯ãããå¥ã®åé¡ã§ããããšã«åæããŸãã OPã«ã¯ã 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
ã䜿çšããå¿
èŠã®ãªãjsã³ãŒããçæã§ããŸãã
@nitzantomerç§ã¯ããªããç¥ã£ãŠããããšãç¥ã£ãŠããŸãããããªãã@grofitã«ææ¡ããŠããããšãç解ããŠããŸããã§ãããããã¯ããèãã®ããã«èãããŸãã
ãã®ãããªãã¿ãŒã³ã䜿çšããããAPIãåŠçããå¿ èŠããªããããç§ã¯æ»ãã 銬ãæã¡è² ãããŠããŸãã ãšã«ããããã®è°è«ã話é¡ããå€ããŠããŸã£ããããããªããã
ãã®è°è«ã«ã€ããŠãã以äžèããããšã¯ãããŸããïŒ typescriptã§throws
å¥ãèŠããã§ãã
@aluanhaddadããªãã¯Error
ãæ¡åŒµããããšã¯æªãç¿æ
£ã ãšèšãç¶ããŸãã ããã«ã€ããŠå°ã詳ãã説æããŠããã ããŸããïŒ
ããã¯é·ãéè°è«ãããŠããŸããã åºæ¬çã«ãçµã¿èŸŒã¿åã確å®ã«æ¡åŒµããããšã¯ã§ããŸããã åäœã¯ãç°å¢ãš--target
èšå®ã®çµã¿åããã«ãã£ãŠå€§å¹
ã«ç°ãªããŸãã
ç§ãå°ããå¯äžã®çç±ã¯ãããªãã®ã³ã¡ã³ããç§ããããæåã«èããããã§ãã å°ãã°ãŒã°ã«ããåŸã Error
ãæ¡åŒµããæ¹æ³ãšçç±ã説æããèšäºããèŠã€ãããŸããã§ããã
ããããåäœããŸããã 詳现ã«ã€ããŠã¯ã httpsïŒ//github.com/Microsoft/TypeScript/issues/12123ããã³ãªã³ã¯ãããŠããå€æ°ã®åé¡ãåç §ããŠãã ããã
ããã¯æ©èœããŸãããES6ãé©å¿ãããã«ã€ããŠå€§å€æ°ã«ãªãã€ã€ãããç¹å®ã®ç°å¢ãã§ã®ã¿æ©èœããŸãã
@nitzantomer ïŒ @throwsãå«ãé¢æ°ããåšå²ã®try/catch
ãªãã§åŒã³åºããããšãã«ãéçºè
ã«éç¥ããTSLintãã§ãã¯ãå®è£
ããããšã¯å¯èœã ãšæããŸããïŒ
@bennynç§ã¯TSLintãŠãŒã¶ãŒã§ãããæ°ããã«ãŒã«ã®äœæãæ€èšããããšã¯ãããŸããã
ãããå¯èœãã©ããïŒç§ã¯ããã ãšæããŸããïŒããããããªãã©ãã»ã©ç°¡åãã¯æ¬åœã«ããããŸããã
ãã£ãŠã¿ããªããããã§æŽæ°ããŠãã ãããããããšãã
@shaipetel ïŒããã³@nitzantomerïŒ
åïŒ
ãããç§ã¯JavaScriptãã©ã®ããã«æ©èœããããç¥ã£ãŠããŸããç§ãã¡ã¯ãããªãå¶éã課ãTypeScriptã«ã€ããŠè°è«ããŠããŸãã
ç§ãææ¡ããã®ã¯ãIMHOã®è¯ã解決çã¯ãTypeScriptãäŸå€åŠçã«åŸãããã«ããããšã§ãããã®äŸå€åŠçã§ã¯ãã¹ããŒããããã¹ãŠã®äŸå€ãç¹å®ã®åºæ¬ã¯ã©ã¹ã§ãããã©ãããããŠããªãå€ãçŽæ¥ã¹ããŒã§ããªãããã«ããå¿ èŠããããŸãã
ãããã£ãŠããthrow0ããŸãã¯ãthrow'someerror 'ãã¯èš±å¯ãããŸããã
JavaScriptãèš±å¯ããã®ãšåãããã«ãTypeScriptã¯èš±å¯ããŸããã
ããã@shaipetelã®ææ¡ã§ãããã©ããã¯ããããŸãããã念ã®ãã... Typescriptã§throw
ãError
ã®ã¿ãè¿ãããã«å¶éããªãããã«æ³šæããŸãã Reactã®ä»åŸã®éåæã¬ã³ããªã³ã°æ©èœã¯ã throw
ing Promise
ã«ãã£ãŠå
éšã§æ©èœããŸãïŒ ïŒç§ãç¥ã£ãŠããå¥åŠã«èãããŸã...ããããç§ã¯åœŒããããã圌ãã®ãŠãŒã¹ã±ãŒã¹ã®ããã«async
/ await
ãšyield
/ yield*
ãžã§ãã¬ãŒã¿ãŒãšæ¯èŒããŠè©äŸ¡ããããšãèªã¿ãŸãããããŠç§ã¯åœŒããäœãããŠããã®ãç¥ã£ãŠãããšç¢ºä¿¡ããŠããŸãïŒïŒ
throw
ing Error
sã¯ã99ïŒ
ã®ãŠãŒã¹ã±ãŒã¹ã§ãããšç¢ºä¿¡ããŠããŸããã100ïŒ
ã§ã¯ãããŸããã Typescriptã¯ããŠãŒã¶ãŒãthrow
Error
åºæ¬ã¯ã©ã¹ãæ¡åŒµãããã®ã ãã«å¶éããã¹ãã§ã¯ãªããšæããŸãã 確ãã«ã¯ããã«é«åºŠã§ããã throw
ã«ã¯ããšã©ãŒ/äŸå€ä»¥å€ã®ãŠãŒã¹ã±ãŒã¹ããããŸãã
@mikeleonard
ç§ã¯åæããŸããããŸããŸãªã¿ã€ããã¹ããŒããæ¢åã®jsã³ãŒãã®å€ãã®äŸããããŸãïŒç§ã¯ããããã®throw "error message string"
ãèŠãŠããŸããïŒã
æ°ããReactæ©èœã¯ãã1ã€ã®è¯ãäŸã§ãã
ã¡ããã©2ã»ã³ãã§ãã³ãŒããasync / awaitã«å€æããŠããã®ã§ãã¹ããŒãããŸãïŒäœè«ã§ãããäŸå€ã¯å«ãã§ãïŒã ç§ã®æèŠã§ã¯ããã®åé¡ã§èª¬æãããŠããããã«throwså¥ã䜿çšãããšããã§ãããã ãæããããèš±ããããšããŠããããã圹ã«ç«ã€ãšæããŸãã ïŒãŸããããã©ã«ãã§ãnothrowsãã«èšå®ããããnothrowsãããã³ã³ã³ãã€ã©ãªãã·ã§ã³ããããŸããïŒ
é¢æ°ãã¹ããŒãããã®ãå ¥åã§ããããã«ããã®ã¯èªç¶ãªæ¡åŒµã®ããã§ãã æ»ãå€ã¯ãªãã·ã§ã³ã§TSã«å ¥åã§ããŸããç§ã«ã¯ãthrowã¯åãªãå¥ã®çš®é¡ã®æ»ãå€ã®ããã«æããŸãïŒhttps://stackoverflow.com/a/39209039/162530ã®ããã«ãthrowãåé¿ããããã«ææ¡ããããã¹ãŠã®éžæè¢ããæããã§ãïŒã
ïŒå人çã«ã¯ãïŒãªãã·ã§ã³ã®ïŒã³ã³ãã€ã©ãªãã·ã§ã³ã䜿çšããŠãã¹ããŒãšããŠå®£èšãããé¢æ°ã®åŒã³åºãå ãã¹ããŒãšããŠå®£èšãããããã£ããããå¿ èŠãããããšã匷å¶ããããšæããŸããïŒ
ç§ã®çŸåšã®ãŠãŒã¹ã±ãŒã¹ïŒ[Angular]ã³ãŒãããŒã¹å šäœãå€æããŠããšã©ãŒåŠçã®äŸå€ã䜿çšããããããŸããïŒç§ã¯ããããå«ã£ãŠããŸãïŒã APIã®å®è£ ã®è©³çŽ°ã§async / awaitã䜿çšããŠããŸãããAPIãæ»ã£ããšãã«throwãéåžžã®Promises / Observablesã«å€æããŸãã ã³ã³ãã€ã©ãŒã«ãç§ãæ£ãããã®ããã£ããããŠããïŒãŸãã¯ãçæ³çã«ã¯ãããããã£ããããŠããïŒããšã確èªããŠããããšäŸ¿å©ã§ãã
@ aleksey-bykov JavaScriptã®æ§è³ªãå€æŽããã®ã§ã¯ãªããJavaScriptã«å ¥åãè¿œå ããã ãã§ãã :)
ã¿ã€ãã³ã°ãè¿œå ãããšããã§ã«å€æŽãããŠããŸãïŒæå³ã®ãªãã³ãŒããåãåãããŸãïŒã
åãããã«ãäŸå€åŠçã匷åã§ããŸã
2018幎7æ26æ¥æšææ¥ãååŸ8æ22åã«Joe [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@ aleksey-bykovhttps ïŒ//github.com/aleksey-bykovå€æŽããªãã§ãã ãã
JavaScriptã®æ§è³ªäžãã¿ã€ãã³ã°ãè¿œå ããŠã¿ãŸãããã :)â
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/Microsoft/TypeScript/issues/13219#issuecomment-408274156 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AA5PzfUNS5E093Z74WA4WCUaTyWRRZC3ks5uKl1FgaJpZM4LXwLC
ã
çŽæã®å Žåãasync / awaitã®ä»£ããã«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)
})
è¿°èªcatchã¯åãåéåããåé€ãã reject()
ãè¿ããšåãè¿œå ãããŸãã ããŸãæ©èœããªãã®ã¯ããŠããªã³ãã©ã¡ãŒã¿åã®æšè«ã ãã§ãïŒãããããã°ïŒ
äžèšã®äŸã§å¯ŸåŠãããåé¡ïŒ
ããããã¹ãŠã®ã³ãŒãã«äœ¿çšããããšã§ç§ãç®ã«ããäž»ãªåé¡ã¯ãã³ãŒã«ããã¯ã·ã°ããã£ã§ããäºææ§ã®ããæ¹æ³ã§æ©èœãããããã«ãããã©ã«ãã®ããªã¿ãŒã³ã¿ã€ããã¯ãmight-throw-anyãã«ãªããŸããå¶éãããå Žåã¯ã 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
çŸåšã®ãã¹ãŠã®ã³ãŒããã³ã³ãã€ã«ãããããšãä¿èšŒããŸãã
nullã®æ»ãå€ãéåžžã«ãŸãã§ããstrictNullChecks
ãšã¯ç°ãªããJSã®äŸå€ã¯éåžžã«æ®åããŠãããšæããŸãã .d.ts
ãã¡ã€ã«ã§ããããã¢ãã«åããããšã¯ããã»ã©æªããªããããããŸããïŒãšã©ãŒã説æããããã«äŸåé¢ä¿ããåãã€ã³ããŒãããŸãïŒããããã¯ééããªãç°¡åãªäœæ¥ã§ã¯ãªãã巚倧ãªçµåããããããŸãã
Promiseã¯ãã§ã«ã©ãããŒã§ãããéåæã³ãŒãã¯éåžžã®ã·ããªãªã§ãšã©ãŒåŠçãæãåå²ããå Žæã§ãããããPromiseãšasync/await
ã«çŠç¹ãåœãŠãããšãé©åãªäžéç¹ã«ãªããšæããŸãã ãã®ä»ã®ãšã©ãŒã¯ããã§ãã¯ãããŠããªãã
@ spion-h4ããã¯ïŒãã§ã«/ä»åŸïŒtypescriptã§äœ¿çšã§ããŸããïŒ
declare function dirtyMap<T>(t:T[], f: (x:T) => U throws any):U[] throws any
@bluelovers
ããããtypescriptã¯çŸåš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
TypeScriptã¯ããããã®åé¡ãåé¿ããã®ã«é©ããç«å Žã«ãããšæããŸãã TypeScriptã¯ã_çŸå®äžç_ã®åé¡ã«å¯Ÿãã_å®çšçãª_ãœãªã¥ãŒã·ã§ã³ã«é¢ãããã®ã§ãã ç§ã®çµéšã§ã¯ã倧ããªJavaScriptããã³TypeScriptã³ãŒãããŒã¹ã§ã¯ããšã©ãŒåŠçã¯æ倧ã®åé¡ã®1ã€ã§ããã©ã®ãšã©ãŒé¢æ°ãã¹ããŒããããåŠçããããã確èªããã®ã¯éåžžã«å°é£ã§ãã åªããããã¥ã¡ã³ãã®èªã¿åããšæžã蟌ã¿ïŒãã®/ sãã©ãã ãåªããŠãããã¯èª°ããç¥ã£ãŠããŸãïŒãŸãã¯å®è£ ã確èªããããšã«ãã£ãŠã®ã¿å¯èœã§ããæ»ãå€ãšã¯éã«ãäŸå€ã¯é¢æ°åŒã³åºããä»ããŠèªåçã«äŒæãããããçŽæ¥åŒã³åºãããé¢æ°ããã§ãã¯ããŸããããã¹ãŠããã£ããããã«ã¯ããã¹ããããé¢æ°åŒã³åºãããã§ãã¯ããå¿ èŠããããŸãã _ããã¯çŸå®ã®åé¡ã§ã_ã
JavaScriptã®ãšã©ãŒã¯ãå®éã«ã¯éåžžã«äŸ¿å©ãªå€ã§ãã NodeJSã®å€ãã®APIã¯ãæ確ã«å®çŸ©ããããšã©ãŒã³ãŒããæã¡ãæçšãªã¡ã¿ããŒã¿ãå
¬éãã詳现ãªãšã©ãŒãªããžã§ã¯ããã¹ããŒããŸãã ããšãã°ã child_process.execFile()
ã®ãšã©ãŒã«ã¯$ exitCode
ãstderr
ã®ãããªããããã£ãããã fs.readFile()
ã®ãšã©ãŒã«ã¯ENOENT
ã®ãããªãšã©ãŒã³ãŒãããããŸãïŒãã¡ã€ã«ãèŠã€ãããŸããïŒãŸãã¯EPERM
ïŒäžååãªæš©éïŒã ç§ã¯ãããè¡ãå€ãã®ã©ã€ãã©ãªãç¥ã£ãŠããŸããããšãã°ã pg
ããŒã¿ããŒã¹ãã©ã€ãã¯ãã©ã®æ£ç¢ºãªåå¶çŽãINSERT
ã®å€±æãåŒãèµ·ãããããç¥ãããã«ããšã©ãŒã«é¢ããååãªã¡ã¿ããŒã¿ãæäŸããŸãã
ãšã©ãŒã«é©åãªãšã©ãŒã³ãŒããããããããäœã§ãããã人ã ãèªèããŠããªããããã³ãŒãããŒã¹ã®ãšã©ãŒã¡ãã»ãŒãžã«å¯ŸããŠå¿é ãªéã®è匱ãªæ£èŠè¡šçŸãã§ãã¯ãèŠãããšãã§ããŸãã
@types
宣èšãšlib.d.ts
ã§ãããã®é¢æ°ãã¹ããŒã§ãããšã©ãŒãå®çŸ©ã§ããã°ãTypeScriptã«ã¯ããšã©ãŒã®æ§é ïŒçºçããå¯èœæ§ã®ãããšã©ãŒãçºçããå¯èœæ§ã®ãããšã©ãŒïŒãæ¯æŽããåããããŸãããšã©ãŒã³ãŒãå€ã¯ãããããæã€ããããã£ã§ãã ããã¯åä»ãäŸå€ã«é¢ãããã®ã§ã¯ãªããããåä»ãäŸå€ã«é¢ãããã¹ãŠã®åé¡ãå®å
šã«åé¿ããŸãã ããã¯ã_çŸå®äžçã®åé¡_ã«å¯Ÿãã_å®çšçãªè§£æ±ºç_ã§ãïŒä»£ããã«ã¢ããã£ãã¯ãšã©ãŒã®æ»ãå€ã䜿çšããããã«äººã
ã«æ瀺ããã®ãšã¯å¯Ÿç
§çã«ãJavaScriptã©ã³ãã®çŸå®ã¯ç°ãªã£ãŠèŠããé¢æ°ã¯ãšã©ãŒãã¹ããŒããŸãïŒã
泚éã¯å®å
šã«ãªãã·ã§ã³ã«ããããšãã§ããŸãïŒãŸãã¯ã³ã³ãã€ã©ãã©ã°ã§å¿
é ã«ããããšãã§ããŸãïŒã 宣èšãã¡ã€ã«ã§æå®ãããŠããªãå Žåãé¢æ°ã¯åã«any
ïŒãŸãã¯unknown
ïŒãã¹ããŒããŸãã
é¢æ°ã¯ã throws never
ã§ã¹ããŒããªãããã«æåã§å®£èšã§ããŸãã
å®è£
ãå©çšå¯èœãªå Žåãé¢æ°ã¯ãåŒã³åºãé¢æ°ã®ãã¹ãŠã®äŸå€ã¿ã€ããšã catch
ã®ããtry
ãããã¯å
ã«ãªãç¬èªã®throw
ã¹ããŒãã¡ã³ãã®åéåãã¹ããŒããŸãã catch
å¥ã
ãããã®1ã€ãany
ãã¹ããŒãããšãé¢æ°ãany
ãã¹ããŒããŸããããã¯åé¡ãããŸããããã¹ãŠã®é¢æ°å¢çã§ãéçºè
ã¯æ瀺çãªã¢ãããŒã·ã§ã³ã䜿çšããŠä¿®æ£ããæ©äŒããããŸãã
ãããŠãå€ãã®å Žåãåäžã®ããç¥ãããé¢æ°ãåŒã³åºãããtry / catchã§ã©ãããããŸãïŒããšãã°ããã¡ã€ã«ãèªã¿åãããããèŠã€ãããªãå Žåã¯åŠçããŸãïŒãTypeScriptã¯catchå¥ã®åãæšæž¬ã§ããŸãã
ãã®ããã®ãšã©ãŒãµãã¯ã©ã¹åãinstanceof
ãå¿
èŠãããŸãã-ãšã©ãŒã¿ã€ãã¯ãæååãªãã©ã«ã§ãšã©ãŒã³ãŒããæå®ããã€ã³ã¿ãŒãã§ã€ã¹ã«ããããšãã§ããTypeScriptã¯ãšã©ãŒã³ãŒãã®åéåãèå¥ããããã¿ã€ãã¬ãŒãã䜿çšãããã§ããŸãã
ãšã©ãŒã¿ã€ãã®å®çŸ©
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
ïŒæ»ãåãžã®åœ±é¿ã«ã¿ã°ãä»ããããšãã§ããMSRã®KokaãæãåºãããŸãã
ææ¡ïŒ
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ã³ãŒããè¿éããå¿ èŠããããŸã-ãã®ããã«ã¯ãåŠçããå¿ èŠã®ããäŸå€ãèŠã€ããããã«ãã¹ãŠã®é¢æ°åŒã³åºããåžžã«ãã§ãã¯ããå¿ èŠããããŸã-ããã¯æ¥œããããšã§ã¯ãããŸãã-_-
PSã https://github.com/Microsoft/TypeScript/issues/13219#issuecomment -428696412ã®æ§æã¯éåžžã«èŠæ ããããã &!
ãšãšã©ãŒã¿ã€ãã<>
ã§ã©ããããã®ã¯é©ãã¹ãããšã§ãã
ç§ãããã«è³æã§ãã çŸåšããã¹ãŠã®ãšã©ãŒã¯åæå®ãããŠããããããã¯ããªãåä»ã§ãã ã»ãšãã©ã®throws
ãã³ãŒãisoãã掟çã§ããããšãé¡ã£ãŠããŸãããã©ãã«ã§ãèšè¿°ããªããã°ãªããŸããã
ãã®ããã«ããŠãéçºè ãæ®ãã®ãšã³ããã€ã³ããªã©ã§ãŠãŒã¶ãŒã«ãããã«ãããšã©ãŒããã£ããããããã«åŒ·å¶ããtslintã«ãŒã«ãäœæããããšãã§ããŸãã
ç§ã¯å®éããã®æ©èœãTypeScriptã®äžã«_ãã§ã«_å«ãŸããŠããªãããšã«é©ããŠããŸããã ç§ãæåã«å®£èšããããšã®1ã€ã ã¹ããŒããããšã©ãŒãçºçããã©ã®ã¿ã€ãã®ãšã©ãŒãã¹ããŒãããããšããæ å ±ãååŸã§ããéããã³ã³ãã€ã©ãŒãããã匷å¶ãããã©ããã¯åé¡ãããŸããã
&!
ãååŸããã Throws<T>
ãååŸãããšããŠããïŒ+ 1ïŒã«ãªããŸãã
ããã¯ãŸãã«ç§ã念é ã«çœ®ããŠããããšã§ããTypeScriptããããã®å¥ããµããŒãããŠããã°ãã¯ããã«çŸããã§ãããã
ãã1ã€ã®å¯èœãªæ©èœã¯ãäœããã®æ¹æ³ã§ïŒããããé¢æ°ã¬ãã«ãŸãã¯ã¢ãžã¥ãŒã«ã¬ãã«ã§ïŒstrictExceptionTrackingã匷å¶ããããšã§ããããã¯ãåŒtry! invokeSomething()
ã䜿çšããŠthrows X
ãšããŠå®£èšããããã®ãåŒã³åºãå¿
èŠãããããšãæå³ããŸãã Rustãšswiftã®ããã«ã
åçŽã«invokeSomething()
ã«ã³ã³ãã€ã«ãããŸãããäŸå€ã®å¯èœæ§ãã³ãŒãã«è¡šç€ºããããããäžæçãªç¶æ
ãæªãå Žåã«å€æŽå¯èœãªãã®ãæ®ããŠããïŒãŸãã¯å²ãåœãŠããããªãœãŒã¹ãç Žæ£ããªãïŒå Žåã«ç°¡åã«èŠã€ããããšãã§ããŸãã
@ be5invis
function square(x: number): number &! never { // This function is pure return x * x } ...
ç§ã¯ããã§2ã»ã³ããäžããŠããã ãã§ããã &!
ã¯ç§ã«ã¯ä¿¡ããããªãã»ã©éãããã«èŠããŸãã
ã¿ã€ãã¹ã¯ãªããã«äžæ
£ããªäººã¯ããã®èšå·ã«èŠæšãŠããããšæããŸããããã¯æ¬åœã«é
åçã§ã¯ãããŸããã
ç§ã®æèŠã§ã¯ãåçŽãªthrows
ã¯ãããæ確ã§ãçŽæçã§ãåçŽã§ãã
ãã以å€ã¯ãåä»ãäŸå€ã®å Žåã¯+1ã ð
å
¥åããã³ãã§ãã¯ãããäŸå€ã®+1ãè¿œå ããããšæããŸãã
ã³ãŒãã§åä»ãäŸå€ãããŸãå©çšããŸããã ç§ã¯instanceof
ã®èœãšãç©Žãååã«èªèããŠããŸããå®éã«ã¯ãå
±éã®åºæ¬ã¯ã©ã¹ããç¶æ¿ããé¢é£ãšã©ãŒã®æ±çšãã³ãã©ãŒãèšè¿°ã§ããããããããæå©ã«äœ¿çšããŠããŸãã åºæ¬ã®Errorã¯ã©ã¹ããã®ç¶æ¿ãåé¿ããããã«ç§ãééããä»ã®ã»ãšãã©ã®ã¡ãœããã¯ãïŒå°ãªããšãïŒåãããã«è€éã§ãããŸããŸãªç¹ã§åé¡ããããŸãã
ãã§ãã¯ãããäŸå€ã¯ãç§ã®æèŠã§ã¯ãã³ãŒãããŒã¹ã«å¯Ÿããéçåæã®æŽå¯ãæ·±ããã®ã«åœ¹ç«ã€æ¹åã§ãã ååã«è€éãªã³ãŒãããŒã¹ã§ã¯ãç¹å®ã®é¢æ°ã«ãã£ãŠã¹ããŒãããäŸå€ãèŠéããã¡ã§ãã
typescriptã§ã³ã³ãã€ã«æã®ãšã©ãŒã®å®å šæ§ãæ¢ããŠãã人ã¯ãç§ã®ts-resultsã©ã€ãã©ãªã䜿çšã§ããŸãã
æ®å¿µãªããã @ vultixã¯ããããããŒã èšå®ã«å ¥ããã®ã«ååãªã»ã©æ確ã§ã¯ãããŸããã
@vultix libã®ã¢ãããŒãã«ã€ããŠã¯äžèšã§èª¬æããŸãããããã®æ©èœã解決ããæ¹æ³ãšã¯æ£å察ã§ãã
Javascriptã«ã¯ãã§ã«ãšã©ãŒãåŠçããã¡ã«ããºã ããããäŸå€ãšåŒã°ããŠããŸãããtypescriptã«ã¯ããã説æããæ¹æ³ããããŸããã
@nitzantomerç§ã¯ãã®æ©èœãtypescriptã®å¿ éåã§ããããšã«å®å šã«åæããŸãã ç§ã®ã©ã€ãã©ãªã¯ããã®æ©èœãè¿œå ããããŸã§ã®äžæçãªä»£åœ¹ã«ãããŸããã
function* range(min: number, max: number): Iterable<number> throws TypeError, RangeError {
ç§ã¯ããã«ã€ããŠãã®ã²ãŒã ã«å°ãé ããŠããããšãç¥ã£ãŠããŸããã以äžã¯ã³ã³ãã§ã¯ãªããããå°ãTypescriptyæ§æã®ããã§ãã
Iterable<number> throws TypeError | RangeError
ããããç§ã¯ãŸã ã³ã³ããåŸæã§ããèšèªã§ãããããã°ããã®ã«ãšæããŸãã
äž»ãªãã®ã¯ã JSON.parse()
ã§æ¬²ããã§ãããªããªããç§ã®ååã®å€ãã¯ã JSON.parse
ããšã©ãŒãã¹ããŒããå¯èœæ§ãããããšãå¿ããŠããããã§ããã«ãªã¯ãšã¹ãã
@WORMSS
åæããŸãã
ç§ã®ææ¡ã«ã¯ãããªããæšå¥šããæ§æãå«ãŸããŠããŸããã
function mightThrow(): void throws string | MyErrorType { ... }
Javaã®ãããªOOPèšèªã®ãšã©ãŒå®£èšãã¿ãŒã³ã«åŸãããšã¯ã§ããŸããïŒ ãthrowsãããŒã¯ãŒãã¯ãæœåšçãªãšã©ãŒã®ããé¢æ°ã䜿çšãããšãã«ãtry..catchããå¿ èŠã§ããããšã宣èšããããã«äœ¿çšãããŸã
@allicanseenow
ææ¡ã¯ãthrowså¥ã®ãªãã·ã§ã³ã®äœ¿çšæ³ã§ãã
ã€ãŸããã¹ããŒããé¢æ°ã䜿çšããŠããå Žåã¯ãtry / catchã䜿çšããå¿
èŠã¯ãããŸããã
@allicanseenowãªã³ã¯ãããèšäºãå«ããã³ã³ããã¹ãã«ã€ããŠäžèšã®ç§ã®èšäºãèªãããšããå§ãããŸãïŒ https ïŒ//github.com/microsoft/TypeScript/issues/13219#issuecomment -416001890
ããã¯typescriptåã·ã¹ãã ã«æ¬ ããŠãããã®ã®1ã€ã ãšæããŸãã
ãã®çŽç²ã«ãªãã·ã§ã³ã§ãçºè¡ãããã³ãŒããå€æŽãããã©ã€ãã©ãªãšãã€ãã£ãé¢æ°ã®æäœã«åœ¹ç«ã¡ãŸãã
ãŸããã©ã®ãšã©ãŒãã¹ããŒãããå¯èœæ§ãããããç¥ã£ãŠãããšãç·šéè ã¯ifæ¡ä»¶ã䜿çšããŠcatchå¥ãããªãŒãã³ã³ããªãŒããããŠãã¹ãŠã®ãšã©ãŒãåŠçã§ããŸãã
ã€ãŸããå®éã«ã¯å°ããªã¢ããªã±ãŒã·ã§ã³ã§ãé©åãªãšã©ãŒåŠçã«å€ããŸããçŸåšã®ææªã®äºæ ã¯ããŠãŒã¶ãŒããã€åé¡ãçºçãããããããªãããšã§ãã
ç§ã«ãšã£ãŠãããã¯çŸåšãTOPã«æ¬ ããŠããæ©èœã§ãã
@RyanCavanaugh ããAwaiting MoreFeedbackãã©ãã«ãè¿œå ãããŠããããããã®ãã£ãŒãããã¯ããããŸããã ã¿ã€ãã¹ã¯ãªããããŒã ã®ã¡ã³ããŒã¯åå ã§ããŸããïŒ
@nitzantomer TypeScriptã«ã¹ããŒãè¿œå ãããšããã¢ã€ãã¢ã¯ãµããŒãããŠããŸããããªãã·ã§ã³ã®try / catchã䜿çšãããšããã¹ããããé¢æ°ã§ã¹ããŒå®£èšãäžæ£ç¢ºã«ãªãå¯èœæ§ããããŸããïŒ
éçºè ãã¡ãœããã®throwså¥ãæ£ç¢ºã§ãããšä¿¡é Œããã«ã¯ããã®ã¡ãœããã®åŒã³åºãéå±€ã®ã©ã®æç¹ã§ããªãã·ã§ã³ã®äŸå€ãç¡èŠãããå ±åãããã«ã¹ã¿ãã¯ãã¹ããŒããããšããå±éºãªä»®å®ãç«ãŠãå¿ èŠããããŸãã @ajxsã¯åœŒã®ã³ã¡ã³ãã®æåŸã§ãããã»ã®ãããããããããªããšæããŸãããããã¯å€§ããªåé¡ã«ãªããšæããŸãã ç¹ã«ãã»ãšãã©ã®npmã©ã€ãã©ãªãã©ãã»ã©æçåãããŠãããã«ã€ããŠã
@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
string | MyError
$ãã¹ããŒããããšãæå¥ãèšãå¿
èŠããããŸãã
ãã®ãã¹ãŠã念é ã«çœ®ããŠããã®ä»®å®ããä»ã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãªã©ã䜿çšãããšãã«éçºè
ãä¿¡é Œããä»ã®å®£èšãããåã®ä»®å®ãããå±éºã§ãããšã¯æããŸããã
ãã¹ãŠã®ãªãã·ã§ã³ãå®éã«ã«ããŒãããã©ããã¯ããããŸãããèå³æ·±ãã·ããªãªãèãåºããŠããã ããã°å¹žãã§ãã
ãããŠããã®åé¡ããã£ãŠããããã¯ãšã«ããä»ãšã»ãšãã©åãã§ãïŒ
// 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) { ... }
}
}
ãããããtypescriptã§ä¿è·ããããšãã§ããŸãããjavascriptãšã¯å°ãç°ãªãæ§æãå¿ èŠã«ãªããŸãã
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;
}
}
}
ããïŒ è¿ä¿¡ããããšãããããŸãïŒ å®éãããªããèšã£ãããã«ã¹ããŒãæšæž¬ããããšã§ãç§ãèããŠãããã®åé¡ã軜æžã§ããŸãã ããããããªãããªã¹ããã2çªç®ã®äŸã¯èå³æ·±ããã®ã§ãã
äžãããã
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ãæ瀺çã«å®£èšããã«ã¯ãã³ãŒã«ã¹ã¿ãã¯ã®ãã¹ãŠã®è¿œå ãšã©ãŒãæ瀺çã«å®£èšããå¿ èŠããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ·±ãã«ãã£ãŠã¯äžæ¡ãã«ãªãå¯èœæ§ããããŸãã ãŸããé¢åãªå¯èœæ§ããããŸãã éäžã§çºçããå¯èœæ§ã®ããæœåšçãªãšã©ãŒã®ãªã¹ããçæããããã«ãã³ãŒã«ãã§ãŒã³å šäœãæãäžããããªãã®ã¯ç¢ºãã§ãããããããIDEã圹ç«ã€å¯èœæ§ããããŸãã
ç§ã¯ãéçºè ããšã©ãŒãæ瀺çã«å®£èšããæ®ããæšãŠãããšãã§ããããã«ãããçš®ã®ã¹ãã¬ããæŒç®åãææ¡ããããšãèããŠããŸããã
function first() : string throws MyVeryImportantError | ... { // Spread the rest of the errors
ããããåãçµæãéæããããã®ããç°¡åãªæ¹æ³ããããŸããã¹ããŒå®£èšãåé€ããã ãã§ãã
function first() : string { // Everything automatically inferred
ã©ã¡ããåé¡ãæèµ·ããŸãïŒtypescriptã«ãšã©ãŒãæšæž¬ãããã®ã§ã¯ãªãã throws
ããŒã¯ãŒãã䜿çšããããšã®å©ç¹ã¯ãã€èŠãããã§ããããïŒ
@ConnorSinnott
ããã¯ãthrowå¥ã䜿çšããä»ã®èšèªãã€ãŸã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();
}
æé»çã«throwå¥ã䜿çšããå Žåãšãã³ã³ãã€ã©ã«æšæž¬ãããå Žåã«ã€ããŠã¯ãtypescriptã§åã宣èšããã®ãšåãã ãšæããŸããå€ãã®å Žåãããããå¿ èŠã¯ãããŸããããã³ãŒããããé©åã«ææžåããããã«è¡ãããšãã§ããŸããåŸã§ãããèªã人ã¯èª°ã§ããããããããç解ããããšãã§ããŸãã
åã®å®å
šæ§ãå¿
èŠãªå Žåã®å¥ã®ã¢ãããŒãã¯ããšã©ãŒãGolangã®å€ãšããŠæ±ãããšã§ãã
https://gist.github.com/brandonkal/06c4a9c630369979c6038fa363ec6c83
ããã§ããããã¯äŸ¿å©ãªæ©èœã§ãã
@brandonkal
ãã®ã¢ãããŒãã¯ãã¹ã¬ããã®ååã§ãã§ã«èª¬æãããŠããŸãã
å¯èœã§ãããããããããšã¯ãjavascriptã§èš±å¯ãããŠããåºæã®éšå/æ©èœãç¡èŠããããšã§ãã
ãŸãã noexcept
æå®åïŒïŒ36075ïŒã¯ãçŸæç¹ã§æãåçŽã§æè¯ã®ãœãªã¥ãŒã·ã§ã³ã ãšæããŸããã»ãšãã©ã®ããã°ã©ããŒãšåæ§ã«ãäŸå€ãã¹ããŒãããšã¢ã³ããã¿ãŒã³ãèæ
®ãããŸãã
ããã«ããã€ãã®ã¯ãŒã«ãªæ©èœããããŸãïŒ
noexcept function foo(): void {
throw new Error('Some exception'); // <- compile error!
}
try..catch
ãããã¯ã«é¢ããèŠåïŒtry { // <- warning!
foo();
} catch (e) {}
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`
}
@moshest
ã»ãšãã©ã®ããã°ã©ããŒãšåæ§ã«ãäŸå€ãã¹ããŒãããšã¢ã³ããã¿ãŒã³ãèæ ®ãããŸãã
ç§ã¯ãã®ãã»ãšãã©ã®ããã°ã©ããŒãã°ã«ãŒãã®äžå¡ã§ã¯ãªããšæããŸãã
noexcept
ã¯ãã£ãããã§ãããããã¯ãã®åé¡ã®ç®çã§ã¯ãããŸããã
ããŒã«ãããã°ãããã䜿çšããŸãã throw
ã try/catch
ã reject
ãããã®ã§ããããã䜿çšããŸãã
ããããtypescriptã§é©åã«å ¥åã§ãããšäŸ¿å©ã§ãã
ããŒã«ãããã°ãããã䜿çšããŸãã
throw
ãtry/catch
ãreject
ãããã®ã§ããããã䜿çšããŸãã
ãã¡ããã ç§ã䜿ããŸãã ç§ã®ãã€ã³ãã¯ã noexcept
ãŸãã¯throws never
ããã®åé¡ã®è¯ãã¹ã¿ãŒãã«ãªããšããããšã§ãã
ã°ãããäŸïŒ Math.sqrt(-2)
ãåŒã³åºããšããšã©ãŒãã¹ããŒãããªãããšãç¥ãããã§ãã
åãããšããµãŒãããŒãã£ã©ã€ãã©ãªã«ãåœãŠã¯ãŸããŸãã ããã«ãããããã°ã©ããŒãšããŠåŠçããå¿ èŠã®ããã³ãŒããšãšããžã±ãŒã¹ããã现ããå¶åŸ¡ã§ããŸãã
@moshest
ãããããªãïŒ
ãã®ææ¡ã«ã¯ããäºæããªããææ¡ã®ãã¹ãŠã®å©ç¹ãå«ãŸããŠããŸãã
æéããããã®ã§ïŒãã®å·ã¯3幎åã§ãïŒãå°ãªããšãæãåºæ¬çãªæ©èœããå§ããããããšãæãã§ããŸããã
@moshest
ãŸããç§ã¯ããçãæéã§æžãéšåçãªè§£æ±ºçãããæéããããããè¯ãæ©èœã奜ã¿ãŸãããç§ãã¡ã¯ãããæ°žé ã«äœ¿ãç¶ããŸãã
noexcept
ã¯åŸã§ç°¡åã«è¿œå ã§ããããã«æããŸãããå®éã«ã¯å¥ã®ãããã¯ã§ããå¯èœæ§ããããŸãã
noexcept
ã¯throws never
ãšåãã§ãã
TBH try/catch
ã®åã®ãã³ããæäŸããããããäŸå€ã®åŠçãä¿èšŒããã¡ã«ããºã ïŒGoã§ã¯error
ã¯äœ¿çšãããŸããïŒãçšæããæ¹ãéèŠã ãšæããŸãã
@rollã¯ãä¿èšŒãããã£ãŠã¯ãªããŸããã
javascriptã§äŸå€ãåŠçããå¿
èŠã¯ãªããtypescriptã§ãå¿
é ã§ã¯ãããŸããã
typescryptã®å³å¯ã¢ãŒãã®äžéšãšããŠãé¢æ°ããšã©ãŒããã£ããããããæ瀺çã«throws
ã宣èšããŠæž¡ãå¿
èŠããããªãã·ã§ã³ã§ããå¯èœæ§ããããŸãã
5ã»ã³ããè¿œå ãããšã null
ãè¿ãé¢æ°ã«äŒŒãäŸå€ã衚瀺ãããŸããããã¯ãéåžžã¯çºçããªããšäºæ³ãããããšã§ãã ãããããããçºçããå Žåãå®è¡æãšã©ãŒãçºçããŸããããã¯æªãããšã§ãã çŸåšãTSã¯ã null
ã®åŠçãæãåºãããããã«ããnull蚱容åã§ã¯ãªãåããè¿œå ããŸããã throws
ãè¿œå ãããšãäŸå€ãåŠçããããã«éç¥ããããšã§ããããã®åãçµã¿ãããã«äžæ©é²ããããšãã§ããŸãã ã ããããããã®æ©èœã¯çµ¶å¯Ÿã«å¿
èŠã ãšæããŸãã
ãšã©ãŒãã¹ããŒãã代ããã«è¿ãGoãèŠããšãäž¡æ¹ã®æŠå¿µã«ããã»ã©éãããªãããšãããã«æ確ã«ããããŸãã ãŸããäžéšã®APIãããæ·±ãç解ããã®ã«åœ¹ç«ã¡ãŸãã ãã¶ããããã€ãã®é¢æ°ãã¹ããŒã§ããããšãç¥ãããæ¬çªç°å¢ã®ããªãåŸã®æ®µéã§ããã«æ°ä»ãã§ãããïŒããšãã°ã JSON.parse
ãããšããã€ãããç¥ã£ãŠãã人ã¯ããŸããïŒïŒã
@ obedm503ããã¯å®éã«ã¯TSã®å²åŠã§ããããã©ã«ãã§ã¯ãã³ã³ãã€ã©ãŒã¯äœãæå¥ãèšããŸããã ãªãã·ã§ã³ãæå¹ã«ããŠç¹å®ã®ãã®ããšã©ãŒãšããŠæ±ãããå³å¯ã¢ãŒããæå¹ã«ããŠãã¹ãŠã®ãªãã·ã§ã³ãäžåºŠã«æå¹ã«ããããšãã§ããŸãã ã ãããããã¯äžããããã¹ãã§ãã
ç§ã¯ãã®ææ¡ãããæ©èœã倧奜ãã§ãã
äŸå€ã®å
¥åãšæšè«ã¯ãããã°ã©ãã³ã°ã®æŽå²å
šäœã§æãåªãããã®ã®1ã€ã§ãã
â€ïž
ããã«ã¡ã¯ãç§ã¯TSã§çŸåšè¡ã£ãŠããåé¿çãèŠã€ããããã«å°ãæéãè²»ãããŸããã é¢æ°ã¹ã³ãŒãå ã§ã¹ããŒããããšã©ãŒã®åãååŸããæ¹æ³ããªãããïŒãŸããçŸåšã®ã¡ãœããã®åãååŸããæ¹æ³ããããŸããïŒãã¡ãœããèªäœã«äºæããããšã©ãŒãæ瀺çã«èšå®ããæ¹æ³ãç解ããŸããã åŸã§ããããã®åãååŸããŠãå°ãªããšãã¡ãœããå ã§äœãã¹ããŒãããããç¥ãããšãã§ããŸãã
ãããç§ã®POCã§ã
/***********************************************
** 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
åã«ã©ããããªããŠããæ¢åã®ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããæ¹ãç°¡åãªå Žåãããããšã«æ°ä»ããŸããã 代ããã«ãè¿ãããåã«ãã®1ã€ãè¿œå ããã ãã§æžã¿ãŸãã次ã®ã³ãŒãã䜿çšãããšãã¹ããŒå¯èœãªãšã©ãŒã次ã®ããã«è¿œå ã§ããŸãã
// 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
ã®äœ¿çšã¯å¥œãã§ã¯ãããŸããããã£ãšè¯ãæ¹æ³ãèŠã€ãããããç¥ããããŸãã
ããã§çµæã®ãã³ãããã¹ãã§ããŸãïŒè¡106ã§typedError
ã«ã«ãŒãœã«ãåãããŸã
@Xampleããã¯ãçŸåšäœ¿çšããŠããããŒã«ã䜿çšããåªãããœãªã¥ãŒã·ã§ã³ã§ãã
ããããå®éã«ã¯ã次ã®ãããªããšãã§ããã®ã§ãããã ãã§ã¯äžååã ãšæããŸãã
const a = superRiskyMethod();
const b = a + 1;
ãããŠãbã®ã¿ã€ãã¯æ£ããæ°ãšããŠæšæž¬ãããŸããããããè©Šè¡ã®äžã«å
ãŸããŠããå Žåã ãã§ã
ããã¯æå¹ã§ã¯ãããŸãã
@luisgurmendezMLabsç§ã¯ããªããäœãæå³ããã®ãããããããŸããã 56è¡ç®ã®@Xampleã®ã¬ãããã©ããšã myNumber + 23
number
ãšããŠæšæž¬ããã myNumber: number & extraType<Error | CustomError>
ã§ããããšãããããŸãã
å¥ã®ãã§ãŒãºã§ã¯ãäŸã®a
ãTryMonadã®ãããªãã®ã«ã©ãããããããšã¯ãããŸããã & extraType<Error | CustomError>
ãšã®äº€å·®ç¹ä»¥å€ã«ã©ãããŒã¯ãããŸããã
çŽ æŽããããã¶ã€ã³@Xampleððððððããã§ãšãããããŸãã ããã¯æ¬åœã«ææã§ãããæ§æç³è¡£ããªããŠããã§ã«æçšã§ãã ãã®ããã®ã¿ã€ãã©ã€ãã©ãªãæ§ç¯ããèšç»ã¯ãããŸããïŒ
@ivawzhç§ã®èãã§ã¯ãå®éã«ã¯ãããã«ããããã€ãã®åé¡ãçºçããå¯èœæ§ããããŸãã
function stillARiskyMethod() {
const a = superRiskyMethod();
return a + 1
}
ãã®é¢æ°åã®æ»ãå€ã¯æ°å€ãšããŠæšæž¬ãããããã¯å®å šã«ã¯æ£ãããããŸãã
@luisgurmendezMLabsã¹ããŒå¯èœãªåã¯ããšã©ãŒã®åãé¢æ°ã«åºå®ããïŒãããŠåŸã§ãããã®åãå埩ã§ããããã«ããïŒæ¹æ³ãšããŠã®ã¿ãé¢æ°ã®æ»ãåå ã«ãããŸãã ç§ã¯å®éã«ãšã©ãŒãè¿ãããšã¯æ±ºããŠãªããããããæããã ãã§ãã ãããã£ãŠãtryãããã¯å ã«ãããã©ããã¯ãäœãå€æŽãããŸããã
@ivawzh質åããŠãããŠããããšããç§ã¯ããªãã®ããã«ããããã£ã
@luisgurmendezMLabsãããããããŸãããtypescriptã¯ãæåã«èŠã€ãã£ãã¿ã€ãã®ã¿ãæšæž¬ããŠããããã§ãã ããšãã°ã次ã®å ŽåïŒ
function stillARiskyMethod() {
return superRiskyMethod();
}
StillARiskyMethodã®æ»ãã¿ã€ãã¯æ£ããæšæž¬ãããŸããã
function stillARiskyMethod() {
return Math.random() < 0.5 superRiskyMethod() : anotherSuperRiskyMethod();
}
æ»ãåãsuperRiskyMethod()
ãšããŠã®ã¿å
¥åãã anotherSuperRiskyMethod()
ã®1ã€ãéããŸãã ç§ã¯ãã以äžèª¿æ»ããŠããŸãã
ãã®ããããšã©ãŒã¿ã€ããæåã§ãšã¹ã«ã¬ãŒã·ã§ã³ããå¿ èŠããããŸãã
function stillARiskyMethod(): number & throwable<exceptionOf<typeof superRiskyMethod>> {
const a = superRiskyMethod();
return a + 1
}
ç§ãããã«èªåã®èããèœãšãããã£ãã ãã§ãã
Error / nullãè¿ãããå Žåãšäœããã¹ããŒãããå Žåã«ã¯ããŸããŸãªãŠãŒã¹ã±ãŒã¹ããããå€ãã®å¯èœæ§ããããããããã¯å®è£ ããã®ã«éåžžã«åªããæ©èœã ãšæããŸãã ãšã«ããäŸå€ãã¹ããŒããããšã¯Javascriptèšèªã®äžéšã§ããããªãããããå ¥åããŠæšæž¬ãããªãã·ã§ã³ãäžããŠã¯ãããªãã®ã§ããããã
ããšãã°ããšã©ãŒãçºçããå¯èœæ§ã®ããå€ãã®ã¿ã¹ã¯ãå®è¡ããŠããå Žåãæ¯åreturnã¿ã€ãããã§ãã¯ããããã«ifã¹ããŒãã¡ã³ãã䜿çšããå¿ èŠãããã®ã¯äžäŸ¿ã§ããããã¯ãtry / catch whereifã䜿çšããããšã§ç°¡ç¥åã§ããŸãããããã®ã¿ã¹ã¯ã®1ã€ãã¹ããŒãããè¿œå ã®ã³ãŒããªãã§ãã£ããã§åŠçãããŸãã
ããã¯ããšã©ãŒãåãæ¹æ³ã§åŠçããå Žåã«ç¹ã«äŸ¿å©ã§ãã ããšãã°ãexpress / node.jsã§ã¯ããšã©ãŒãNextFunction
ïŒãšã©ãŒãã³ãã©ãŒïŒã«æž¡ãããå ŽåããããŸãã
æ¯åif (result instanceof Error) { next(result); }
ãå®è¡ããã®ã§ã¯ãªãããããã®ã¿ã¹ã¯ã®ãã¹ãŠã®ã³ãŒããtry / catchã§ã©ããããããšãã§ããŸããç§ã®ãã£ããã§ã¯ãäŸå€ãã¹ããŒãããã®ã§ããããåžžã«èªåã®ãšã©ãŒãã³ãã©ãªã®ã§ã catch(error) { next(error); }
ãå¯èœã§ã
ãŸããããã«ã€ããŠã¯ãŸã 説æãããŠããŸããïŒãã ããèŠéããŠããå¯èœæ§ããããŸããããã®ã¹ã¬ããã«ã¯ããªãã®æ°ã®ã³ã¡ã³ãããããŸãïŒïŒãããããå®è£
ãããŠããå Žåãã䜿çšããã«ã¹ããŒããé¢æ°ãæã€ããšãå¿
é ã«ãªããŸãïŒã€ãŸããã³ã³ãã€ã«ãšã©ãŒïŒãé¢æ°å®£èšã®throws
å¥ïŒ ããã¯ããããšã ãšæããŸãïŒã¹ããŒãåŠçããããã«åŒ·å¶ããã®ã§ã¯ãªããé¢æ°ãã¹ããŒããããšãéç¥ããã ãã§ãïŒããããã§ã®å€§ããªæžå¿µã¯ãTypescriptããã®ããã«æŽæ°ãããå ŽåãçŸåšååšããå€ãã®ã³ãŒããå£ããŸãã
ç·šéïŒç§ãèãããã1ã€ã®ãŠãŒã¹ã±ãŒã¹ã¯ã@ throwsã¿ã°ã䜿çšããJSDocã®çæã«ã圹ç«ã€å¯èœæ§ããããŸã
ããã§ãä»ã³ããããããŠããåé¡ã§ç§ãèšã£ãããšãç¹°ãè¿ããŸãã
typescriptã¯ãã»ãšãã©ã®JavaScriptåŒã®ãšã©ãŒã¿ã€ããæšæž¬ã§ããã¯ãã ãšæããŸãã ã©ã€ãã©ãªäœæè ã«ããããè¿ éãªå®è£ ãå¯èœã«ããŸãã
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
ã¯ãevalã...äžæã§ããããã unknown
ãã¹ããŒããå¿
èŠããããŸãe
ã¯d
ã®ãšã©ãŒããã£ããããŸãããcatchãããã¯ã«ã¯throw
ããããããããã§ã¯ããããã¯ã®ã¿ã§ããããããã®ã¿ã€ã'too bad...'
ãæšæž¬ããŸãã throw 'primitive value'
ãå«ãŸããŠããŸã$ïŒ Error
ãã¹ããŒã§ããªããšèšããŸãïŒJSã®é»éè¡ãéããå Žåã¯èšæ£ããŠãã ãã...ïŒf
ã¯ã b
ãa
ããè¡ã£ãã®ãšåãããã«ã c
ããç¶æ¿ããŸããg
$ã¯a
'unlucky'
$ãç¶æ¿ãã c
unknown
$ãç¶æ¿ããããã '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
ã®ã¿ã°ãä»ããŠããŸããããã£ãŒãããã¯ãããã«æäŸããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯ç§ãJavaèšèªãããããŸããæãå¯äžã®æ©èœã§ã
APIåŒã³åºãã200以å€ã®ã³ãŒããè¿ããšãã«ãç¹å®ã®ãšã©ãŒãã¹ããŒãããŠãŒã¹ã±ãŒã¹ããããŸãã
interface HttpError extends Error {
response: Response
}
try {
loadData()
} catch (error: Error | ResponseError) {
if (error.response) {
checkStatusCodeAndDoSomethingElse()
} else {
doGenericErrorHandling()
}
}
catchãããã¯ãå ¥åã§ããªããšãéçºè ã¯2çš®é¡ã®ãšã©ãŒãã¹ããŒãããå¯èœæ§ãããããšãå¿ããŠããŸããäž¡æ¹ãåŠçããå¿ èŠããããŸãã
ç§ã¯åžžã«Errorãªããžã§ã¯ããã¹ããŒããããšã奜ã¿ãŸãïŒ
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')) { .....}
}
}
ãã®æ©èœããŸã ãååãªãã£ãŒãããã¯ããªããã®ã¯ãªãã§ããïŒ indexedDBãlocalstorageãªã©ã®ãã©ãŠã¶ã®APIãåŒã³åºããšãã«éåžžã«äŸ¿å©ã§ãã ããã¯è€éãªã·ããªãªã§å€ãã®å€±æãåŒãèµ·ãããŸããããéçºè ã¯ããã°ã©ãã³ã°ã§æ°ä»ãããšã¯ã§ããŸããã
ããŒã²ã«ã¯ãã®æ©èœãå®å
šã«åããŠããããã§ãã
https://hegel.js.org/docs#benefits ïŒãå
¥åããããšã©ãŒãã»ã¯ã·ã§ã³ãŸã§ã¹ã¯ããŒã«ïŒ
TypeScriptã«ãåæ§ã®æ©èœãããã°ããã®ã«ãšæããŸãã
DL; DR;
try
ãããã¯å
ã§ã¹ããŒãããã¿ã€ãã¯ãã¹ãŠããŠããªã³ã䜿çšããŠcatch
ã®ãšã©ãŒåŒæ°ã«æšè«ããå¿
èŠããããŸããany
ã ãã§ãªããå®éã®åã䜿çšããŠé©åã«åæå®ããå¿
èŠããããŸããããŠãããããç§ãã¡ã¯ç§ãã¡ã®ããŒãºãšæåŸ ãäœã§ããããåçŽã«æ確ã«ããå¿ èŠããããŸãïŒ
ãšã©ãŒã¯éåžžãjsã§ã¯3ã€ã®æ¹æ³ã§åŠçãããŸã
ã³ãŒã«ããã¯ã®äœ¿çšïŒå®éã«å ¥åã§ããŸãïŒ
䜿çšäŸïŒ
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;
}
çŽæã解決ãŸãã¯æåŠãããå Žåã解決ãããvalue
ãå
¥åããããšã¯ã§ããŸããã reason
ãšåŒã°ããããšãå€ãæåŠãå
¥åããããšã¯ã§ããŸããã
ãããpromiseã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®çœ²åã§ããçç±ã¯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>;
ãã®ããã«ããŠãçè«çã«ã¯ãããŒãã³ãŒã«ããã¯ãšpromiseã®éã§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>;
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
é¢æ°å
ã§promiseã䜿çšããããšããããŸããïŒããŸã ãéæ³ã¯ãããŸããïŒã çŽæãããããŒãã³ãŒã«ããã¯ã®äœ¿çšïŒ
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ã¹ã³ãŒãå
ã§ã¹ããŒãããå¯èœæ§ã®ãããšã©ãŒã®ã¿ã€ããäºæž¬ã§ããããã«ããããã®typescriptã®æ¬ èœæ
å ±ã¯ãããŸããã
ãã ããå
éšã®ãã€ãã£ãé¢æ°ããœãŒã¹ã³ãŒãå
ã«ãªããšã©ãŒãçºçãããå¯èœæ§ãããããšãèæ
®ããå¿
èŠããããŸããããthrowãããŒã¯ãŒãããœãŒã¹ã«ãããã³ã«ãTSã¯ã¿ã€ããåéãããšã©ãŒã®å¯èœæ§ã®ããã¿ã€ããšããŠææ¡ããå¿
èŠããããŸãã ãã¡ããããããã®ã¿ã€ãã¯try
ãããã¯ã«ãã£ãŠã¹ã³ãŒããããŸãã
ããã¯æåã®ã¹ãããã«éãããå³å¯ãªã¢ãŒãã§TSãJavaã®ããã«åäœããããã€ãŸããŠãŒã¶ãŒã«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
ã¿ã€ãã§ããå¯èœæ§ãããããšãç¥ãããšã¯ãéåžžã«åœ¹ç«ã¡ãŸãã ãã ããèããããã¿ã€ãã®ãšã©ãŒã®åŠçãå¿ããªãããã«ããããã«ãèããããçµæã®å³å¯ãªã»ãããªãã§ãåå¥ã®if / elseãããã¯ã䜿çšããããšã¯å®éã«ã¯æåã®ã¢ã€ãã¢ã§ã¯ãããŸããã
ãã ããç¹å®ã®ã±ãŒã¹ïŒããã©ã«ãã®å¥ã«ãã©ãŒã«ããã¯ããã±ãŒã¹ïŒã«äžèŽããã®ãå¿ããå Žåã«èŠåã衚瀺ãããå¯èœæ§ããããããswitchã±ãŒã¹ã®æ¹ãã¯ããã«åªããŠããŸãã ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã®ã±ãŒã¹ãåãæ¿ããããšã¯ã§ããŸããïŒäœãããã¯ãªããšãããªãéãïŒãã§ãããšããŠããäœã§ãã¹ããŒã§ããŸãïŒãªããžã§ã¯ãã ãã§ãªããããŒã«å€ãæååãããã³ãã€ã³ã¹ã¿ã³ã¹ãã®ãªãæ°å€ïŒã ãã ããã€ã³ã¹ã¿ã³ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠãã€ã³ã¹ã¿ã³ã¹ãã©ã®ã¿ã€ãã§ãããã確èªã§ããŸãã ããã§ãäžèšã®ã³ãŒãã次ã®ããã«æžãçŽãããšãã§ããŸãã
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;
}
}
HorrayâŠæ®ã£ãŠããå¯äžã®åé¡ã¯ãTSãerror.constructor
ãå
¥åããªããããã¹ã€ããã±ãŒã¹ãçµã蟌ãæ¹æ³ããªãããšã§ãïŒãŸã ïŒïŒãããããå Žåãå®å
šã«å
¥åããããšã©ãŒèšèªããããŸãã jsã
ããã«ãã£ãŒãããã¯ãå¿ èŠãªå Žåã¯ã³ã¡ã³ãããŠãã ãã
æãåèã«ãªãã³ã¡ã³ã
@ aleksey-bykov
ç§ã®ã³ãŒãã§
throw
ããŸã£ãã䜿çšããã代ããã«çµæãïŒãšã©ãŒãçºçããå¯èœæ§ã®ããé¢æ°ã§ïŒã©ããããããšãææ¡ããŠããŸãããã®ã¢ãããŒãã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã
Tried<>
ãååŸããé¢æ°ã¯ãšã©ãŒãç¡èŠããããšãéžæã§ããŸãããthrows
ãè¿œå ãããšãã³ãŒãã3çªç®ã®ã©ã€ãã©ãªããã€ãã£ãjsããã®ãšã©ãŒãåŠçããããšãéžæããéçºè ãæå¹ã«ãªããŸããææ¡ã§ã¯ãšã©ãŒã®æšæž¬ãèŠæ±ããããããçæããããã¹ãŠã®å®çŸ©ãã¡ã€ã«ã«
throws
å¥ãå«ããããšãã§ããŸããããã¥ã¡ã³ãã«ç§»åããå¿ èŠãããçŸåšã®ç¶æ ã§ã¯ãªããé¢æ°ãå®çŸ©ãã¡ã€ã«ããçŽæ¥ã¹ããŒããå¯èœæ§ã®ãããšã©ãŒãç¥ãããšã¯éåžžã«äŸ¿å©ã§ããããšãã°ã
JSON.parse
ãã¹ããŒããå¯èœæ§ã®ãããšã©ãŒãç¥ãå¿ èŠããããŸãã MDNããŒãžã«ç§»åãã次ã®ããã«èªã¿ãŸãããããŠãããã¯ãšã©ãŒãææžåãããŠããå Žåã®è¯ãã±ãŒã¹ã§ãã