Typescript: λ‚΄μž₯ μœ ν˜•μ„ ν™•μž₯ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2014λ…„ 11μ›” 14일  Β·  14μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

ES6λŠ” Object, Boolean, Error, Map, Promise ..etc와 같은 일뢀 λ„€μ΄ν‹°λΈŒ 개체λ₯Ό ν•˜μœ„ 클래슀둜 μ§€μ •ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ꡬ쑰가 lib.d.tsμ—μ„œ λͺ¨λΈλ§λ˜λŠ” 방식은 var와 μΈν„°νŽ˜μ΄μŠ€μ˜ 쌍으둜 μ •μ˜λ˜λ―€λ‘œ μ„œλΈŒ ν΄λž˜μŠ€κ°€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

ES6 사양 μ„Ήμ…˜ 19.5.1μ—μ„œ :

Error μƒμ„±μžλŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€λ˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 클래슀 μ„ μ–Έμ˜ extends 절의 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ§€μ •λœ Error 비헀이비어λ₯Ό μƒμ†ν•˜λ €λŠ” ν•˜μœ„ 클래슀 μƒμ„±μžμ—λŠ” ν•˜μœ„ 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” Error μƒμ„±μžμ— λŒ€ν•œ 수퍼 호좜이 ν¬ν•¨λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

ν˜„μž¬ "ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀 만 ν™•μž₯ ν•  수 μžˆμŠ΅λ‹ˆλ‹€"였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

class NotImplementedError extends Error {
    constructor() {
        super("Not Implemented");
    }
}
Bug ES6 Fixed

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μš”μ¦˜ Error 클래슀λ₯Ό ν™•μž₯ ν•  μˆ˜μžˆλŠ” κΈ°λŠ₯도 μžˆμ§€λ§Œ, λ…Έλ“œμ—μ„œ μ—¬μ „νžˆ 뢈편 함을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ "error.stack"에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. throw new Error(...) ν•˜λ©΄ error.stack λ₯Ό λ°›μ§€λ§Œ throw new CustomError() μ•ˆ λΌμš”. 그것을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚˜λŠ”μ΄ νŠΈλ¦­μ„ μ‚¬μš©ν•˜λ„λ‘ κ°•μš”ν–ˆλ‹€.

export class HttpError extends Error {
    httpCode: number;
    message: string;

    constructor(httpCode: number, message?: string) {
        super();
        if (httpCode)
            this.httpCode = httpCode;
        if (message)
            this.message = message;

        this.stack = new Error().stack;
    }
}

λͺ¨λ“  14 λŒ“κΈ€

이것은 ν•˜μœ„ ν΄λž˜μŠ€κ°€ 될 ν•¨μˆ˜λ₯Ό λ…ΈμΆœν•˜λŠ” js 라이브러리의 일반적인 λ¬Έμ œμž…λ‹ˆλ‹€. λ‚΄ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ Foo μƒμ„±μžλ₯Ό 내보내고 Foo와 μœ μ‚¬ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 객체뿐만 μ•„λ‹ˆλΌ Foo의 ν•˜μœ„ 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό μˆ˜μ‹  ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜λŠ” 경우 ν˜„μž¬μ΄λ₯Ό ν—ˆμš© ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 말할 수 있고 μ‹Άλ‹€

class Error;

κ·ΈλŸ¬ν•œ λͺ…λ Ήλ¬Έμ—λŠ” μžλ°” μŠ€ν¬λ¦½νŠΈκ°€ μƒμ„±λ˜μ§€ μ•Šκ³  Typescript의 기호 ν…Œμ΄λΈ” 만 μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

일반적인 κ²½μš°μ—λŠ” 클래슀 μ„ μ–Έμ˜ 본문을 μ„Έλ―Έμ½œλ‘ μœΌλ‘œ λŒ€μ²΄ν•˜μ—¬ λ‹€μŒκ³Ό 같은 것을 ν—ˆμš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

class Foo<X, Y> extends Bar<X> implements Baz<Y>;

μ΄λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ Foo.prototype이 Bar.prototype의 μΈμŠ€ν„΄μŠ€μž„μ„ 이미 보μž₯ν•˜κ³  Baz μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ 함을 μ˜λ―Έν•©λ‹ˆλ‹€.

@metaweta λ‚˜λŠ” 그것이 μ•½κ°„μ˜ 쀑볡을 λ§Œλ“€ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

interface Foo {
}
class Foo; // Foo is now a class!
interface Bar extends Foo {
}
class Bar extends Foo; // Two `extends Foo`s. 

interface X {
}
class X extends Foo; // Hmm?
interface Y extends Foo {
}
class Y; // Hmm?

μ„œλΈŒ 클래 μ‹± κ°€λŠ₯ν•œ μΈν„°νŽ˜μ΄μŠ€κ°€ κ°œλ°©ν˜• 클래슀둜 μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— μ—¬μ „νžˆ 잠재λ ₯이 μžˆμŠ΅λ‹ˆλ‹€. # 819

@metaweta 첫 번째 κ²½μš°λŠ” μ•°λΉ„μ–ΈνŠΈ 클래슀 선언에 μ˜ν•΄ μ²˜λ¦¬λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. 예

// myLib.d.ts
declare class Error {
}
// no code emitted here for this. 
// myfile.ts
// Error is subclassable,
class MyError extends Error {
}

두 번째 κ²½μš°μ—λŠ” λ‹€λ₯Έ μ œμ•ˆ 문제λ₯Ό μ œμΆœν•©λ‹ˆλ‹€.

λ‹€μŒμ€ ES6 μ‚¬μ–‘μ˜ "μ„œλΈŒ 클래슀 κ°€λŠ₯"개체의 전체 λͺ©λ‘μž…λ‹ˆλ‹€. ν˜„μž¬ 이듀은 λͺ¨λ‘ μΈν„°νŽ˜μ΄μŠ€ / var 쌍으둜 μ •μ˜λ©λ‹ˆλ‹€.

  • λͺ©μ 
  • λΆ€μšΈ
  • 였λ₯˜
  • NativeError
  • 번호
  • 데이트
  • 끈
  • RegExp
  • μ •λ ¬
  • TypedArray (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array 및 DataView)
  • 지도
  • μ„ΈνŠΈ
  • WeakMap
  • WeakSet
  • μ–΄λ ˆμ΄ 버퍼
  • DataView
  • 약속

문제점 :

  • μœ ν˜•μ΄ 클래슀둜 μ •μ˜λ˜λ©΄ 멀버 츑을 ν™•μž₯ ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€ (정적 μΈ‘ ν™•μž₯은 λͺ¨λ“ˆμ„ 톡해 λ°œμƒν•  수 있음).
  • 클래슀λ₯Ό μž¬μ •μ˜ ν•  수 μ—†κΈ° λ•Œλ¬Έμ— 멀버 츑에 λŒ€ν•œ κΈ°μ‘΄ ν™•μž₯이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ (λΈŒλ ˆμ΄ν‚Ή λ³€κ²½).
  • 객체, λ¬Έμžμ—΄, λΆ€μšΈ, λ‚ μ§œ, 숫자, RegExp, 였λ₯˜ 및 λ°°μ—΄κ³Ό 같은 ν΄λž˜μŠ€μ—μ„œ ν•¨μˆ˜ ν˜ΈμΆœμ„ λͺ¨λΈλ§ν•˜λŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€. (λ‹€μ‹œ λΈŒλ ˆμ΄ν‚Ή 체인지)

κ°€λŠ₯ν•œ ν•΄κ²°μ±…:

  • ν”„λ‘œν†  νƒ€μž… 속성 및 ꡬ성 μ‹œκ·Έλ‹ˆμ²˜λ‘œ λͺ¨λ“  μœ ν˜• ν™•μž₯ ν—ˆμš©
  • 클래슀의 μΈμŠ€ν„΄μŠ€ μΈ‘ ν™•μž₯ ν—ˆμš© (예 : λͺ¨λ“ˆ Class.prototype {}, @RyanCavanaugh 제곡 )
  • 클래슀 μƒμ„±μžμ—μ„œ 호좜 μ„œλͺ… μ •μ˜ ν—ˆμš©

@mhegazy κ°μ‚¬ν•©λ‹ˆλ‹€. μ•°λΉ„μ–ΈνŠΈ 클래슀 μ„ μ–Έ ꡬ쑰λ₯Ό μ•Œμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

이런 μ‹μœΌλ‘œ Error 클래슀λ₯Ό ν™•μž₯ ν•  λ•Œ (μ•°λΉ„μ–ΈνŠΈ 클래슀 μ •μ˜ μ‚¬μš©) ExtendedErrorλ₯Ό λ˜μ§€λ©΄ μŠ€νƒ 좔적이 μƒμ„±λ˜κ±°λ‚˜ λ©”μ‹œμ§€κ°€ μ œλŒ€λ‘œ ν• λ‹Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

declare class Error {
  constructor(message?: string);
}

class ExtendedError extends Error {
  constructor(message?: string) {
    super(message + " extended");
  }
}

//throw new Error("Test");
throw new ExtendedError("Test");

@unional 이것은 엔진 문제처럼 λ³΄μž…λ‹ˆλ‹€. ES6 사양에 따라 μž‘λ™ν•©λ‹ˆλ‹€. 엔진은 ES6κ°€ λΉ„μ€€λ˜μ—ˆμœΌλ―€λ‘œ 이제이λ₯Ό μˆ˜μ •ν•΄μ•Όν•©λ‹ˆλ‹€.

λ‚˜λŠ” 그것을 μž‘λ™μ‹œν‚¬ 수 μžˆμ—ˆλ‹€. μž‘λ™ μ€‘μ΄λ˜ js μ½”λ“œμ—μ„œ Error.captureStackTrace 호좜이 μžˆμ§€λ§Œ 였λ₯˜ 선언에 였λ₯˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— tsμ—μ„œ κ΅¬ν˜„ν•  λ•Œ μ œκ±°ν•©λ‹ˆλ‹€.

예제 μ½”λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
innerExceptionμ„λ°›λŠ” 것은 C #κ³Ό μœ μ‚¬ν•œ μ˜ˆμ™Έμž…λ‹ˆλ‹€.

declare class Error {
    public name:string;
    public message:string;
    public stack:string;
    constructor(message?:string);
    static captureStackTrace(error: Error, constructorOpt: any);
}

class Exception extends Error {
    public innerException: Error;
    constructor(message?: string, innerException?: Error|string) {
        // Guard against throw Exception(...) usage.
        if (!(this instanceof Exception)) return new Exception(message, innerException);
        super();
        if (typeof Error.captureStackTrace === 'function') {
            //noinspection JSUnresolvedFunction
            Error.captureStackTrace(this, arguments.callee);
        }
        this.name = "Exception";
        if (innerException) {
            if (innerException instanceof Error) {
                this.innerException = innerException;
                this.message = message + ", innerException: " + this.innerException.message;
            }
            else if (typeof innerException === "string") {
                this.innerException = new Error(innerException);
                this.message = message + ", innerException: " + this.innerException.message;
            }
            else {
                this.innerException = innerException;
                this.message = message + ", innerException: " + this.innerException;
            }
        }
        else {
            this.message = message;
        }
    }
}

# 3516으둜 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 ν΄λž˜μŠ€λŠ” μƒμ„±μž ν•¨μˆ˜ μœ ν˜•μ˜ μž„μ˜ ν‘œν˜„μ‹μ„ ν™•μž₯ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 μˆ˜μ • 사항이 제곡 될 TypeScript의 λ¦΄λ¦¬μŠ€λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?
1.5.3 및 1.5.4의 릴리슀 λ ˆμ΄λΈ”μ„ μ‹ μ†ν•˜κ²Œ ν™•μΈν–ˆλŠ”λ° 아직 λ°°μ†‘λ˜μ§€ μ•Šμ€ 것 κ°™μœΌλ©° ν˜„μž¬λ‘œμ„œλŠ” λ§ˆμŠ€ν„°μ—μ„œλ§Œ μ œκ³΅λ©λ‹ˆλ‹€.

νŽΈμ§‘ν•˜λ‹€:
μ£„μ†‘ν•©λ‹ˆλ‹€. ν˜„μž¬ μ΄μ •ν‘œ "TypeScript 1.6"으둜 ν‘œμ‹œλœ 버그λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

μž‘μ—… ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

@kostrse npm install -g typescript@next λ₯Ό μ‹€ν–‰ν•˜μ—¬ TypeScript 1.6의 μ•Όκ°„ 릴리슀λ₯Ό μ‚¬μš©ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”,

Typescript 1.6.2λ₯Ό μ‚¬μš©ν•˜κ³  있으며 lib.es6.d.tsλŠ” 였λ₯˜ (및 λ°°μ—΄, ...) ν΄λž˜μŠ€κ°€ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€λ‘œ.
1.6.2μ—μ„œ 이미 μˆ˜μ • λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

건배!

@jpsfs μˆ˜μ • 사항은 https://github.com/Microsoft/TypeScript/issues/1168#issuecomment -112955503 μ—μ„œ @ahejlsbergκ°€ μ–ΈκΈ‰

μš”μ¦˜ Error 클래슀λ₯Ό ν™•μž₯ ν•  μˆ˜μžˆλŠ” κΈ°λŠ₯도 μžˆμ§€λ§Œ, λ…Έλ“œμ—μ„œ μ—¬μ „νžˆ 뢈편 함을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ "error.stack"에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. throw new Error(...) ν•˜λ©΄ error.stack λ₯Ό λ°›μ§€λ§Œ throw new CustomError() μ•ˆ λΌμš”. 그것을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚˜λŠ”μ΄ νŠΈλ¦­μ„ μ‚¬μš©ν•˜λ„λ‘ κ°•μš”ν–ˆλ‹€.

export class HttpError extends Error {
    httpCode: number;
    message: string;

    constructor(httpCode: number, message?: string) {
        super();
        if (httpCode)
            this.httpCode = httpCode;
        if (message)
            this.message = message;

        this.stack = new Error().stack;
    }
}
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰