2017-10-10 5 views
0

어쨌든 Date, String, Array 등과 같은 유형에 일부 정적 메서드를 추가 할 방법이 있습니까? 예를 들어 TypeScript : 내장 클래스에 정적 메서드를 추가하는 방법

나는 방법 today Object.defineProperty Date 클래스에 자바 스크립트에서 나는 단순히 그것에 속성을 추가하거나 어쩌면 내가 사용 할 수 :

Date.today = function(){ 
    let date = new Date; 
    date.setHours(0,0,0,0); 
    return date; 
} 

Object.defineProperty(Date, 'today', { get() { ... }}); 

을하지만 didn를 어쨌든이 새로운 정적 멤버에 대해 TypeScript에게 알릴 수 없습니다. 나는 뭔가를 놓치고 있습니까? 아니면 제가 잘못 했나요?

declare global { 
    interface DateConstructor { 
     today:() => Date 
    } 
} 

Date.today = function(){ 
    let date = new Date; 
    date.setHours(0,0,0,0); 
    return date; 
} 

는 마찬가지로 문자열과 배열에 대한 StringConstructorArrayConstructor을 확장 :

+0

은 https ://stackoverflow.com/questions/36910521/how-to-extend-native-javascript-types-in-typescript-1-8-using-global-augmentatio – haim770

+0

@ haim770 내가 말했듯이 클래스 확장은 프로토 타입이 아닙니다. –

답변

2

당신은 정적 속성을 추가 할 수 DateConstructor 인터페이스를 증대해야한다. declaration merging을 참조하십시오.

0

이 코드를 사용하여 정적 방법으로 개체를 확장합니다. 수출 클래스 ObjectExtensions {} main.ts에서

declare global { 
    interface ObjectConstructor { 
     safeGet<T>(expresstion:() => T, defaultValue: T): T; 
    } 
} 

Object.safeGet = function <T>(expresstion:() => T, defaultValue: T): T { 
    try { 
     const value = expresstion(); 
     if (value != null) return value; 

    } catch (e) { 
    } 
    return defaultValue; 
} 

당신이

new ObjectExtensions(); 

처럼이 클래스를 호출해야 그리고 당신은 다음과 같이 사용할 수 있습니다 :

Object.safeGet<number>(() => data.property.numberProperty); 
+0

'import'를 쉽게 사용할 수 있습니다. 추가 수업을 만들 필요가 없습니다. –