2013-07-24 7 views
5

정적 문자열 개체에 isNullOrEmpty (str : string)를 추가하는 방법이 있습니까?TypeScript extends String 정적

같은 내가 그것을 호출 할 수 있습니다 :

String.isNullOrEmpty(myobj); 

내가 구현에 넣어하는 방법을 발견하지만이 이와 같은 방법에 대한 도움이되지 않습니다.

+0

는 단순히 '사용할 수없는 이유가 있나요'연산자!? 예를 들면 :'if (! str) {...}? ' – jsalonen

+0

대부분이 예제로 이것을 사용하고 있습니다. – maxfridbe

+0

예제는 무엇입니까?빈 문자열을 검사하는 방법에 특히 관심이 있습니까? 아니면 문자열과 같은 기존 객체를 확장하는 일반적인 방법을 원하십니까? – jsalonen

답변

3

TypeScript는 선언 합병이라 불리는 것을 수행하는데, 이것은 10.5 절의 the spec에서 설명됩니다.

요점은 모듈을 foo에 넣은 다음 나중에 더 많은 멤버를 모듈 foo에 넣을 수 있다는 것입니다. 0.9부터는 클래스가 먼저 선언되는 한 클래스의 네임 스페이스에 멤버를 추가하는 것으로 확장됩니다. 이것은 새로운 기능이며 주변에 버그를 발견했지만 작동해야합니다.

그래서 특별히 당신은 그냥 이렇게 할 수 있습니다 귀하의 질문에 대답하기 :

module String { 
    export function isNullOrEmpty(s: string): boolean { 
     return !s; 
    } 
} 

var s: string; 
alert(String.isNullOrEmpty(s).toString()); // true 
s = ""; 
alert(String.isNullOrEmpty(s).toString()); // true 
s = "asdf"; 
alert(String.isNullOrEmpty(s).toString()); // false 

Try it out합니다.


문자열은 var가 아닌 모듈로 선언 되었기 때문에 분명히 내 대답이 완전하지 않습니다. 선언 합병은 성가신 vars (0.9 현재)로 이어지지 않습니다. 이 해킹의 비트가 비록이 주위에 방법이 여전히있다 :

// filea.ts 
module String { 
    export function isNullOrEmpty(s: string): boolean { 
     return !!s; 
    } 
} 
module mynamespace { 
    export declare var String: { 
     new (value?: any): String; 
     (value?: any): string; 
     prototype: String; 
     fromCharCode(...codes: number[]): string; 
     isNullOrEmpty(s: string): boolean; 
    } 
} 

// fileb.ts 
/// <reference path="filea.ts" /> 
module mynamespace { 
    var s: string; 
    String.isNullOrEmpty(s); // true 
    s = ""; 
    String.isNullOrEmpty(s); // true 
    s = "asdf"; 
    String.isNullOrEmpty(s); // false 
} 
당신이 VAR 문자열에 기능을 넣어, 다음 mynamespace.String이 lib에 모든 문자열에 존재한다는 것을 선언하고 무엇 filea에서 일어나는

.d.ts에는 추가 한 항목이 더해졌습니다. 그런 다음 mysnamespace에서 작업하는 동안 String에 대한 참조는 사용자가 mynamespace.String이라고 가정합니다. 그게 진짜로 존재하지 않기 때문에 당신이 원하는 좋은 '문자열'을 얻을 수 있습니다.

나는 약간 더러웠다. 그러나 당신이보기 흉한 것을 따르고 있다고 가정하면 namespace conventions 당신은 한 번만해야 할 최상위 네임 스페이스를 가져야한다. 라이브러리의 일부로 String 확장을 공유하려는 경우 ... 잘 붙어 있습니다.

+0

놀이터에서 예상대로 작동하지만 두 개의 TS 파일로 분리하고 string.d.ts를 참조하면 예상대로 사용할 수 없습니다. – maxfridbe

+0

아 맞습니다. lib.d.ts 문자열에있는 문제는 모듈 대신 var로 선언됩니다 (병합에 적합하지 않음). 동일한 네임 스페이스에서 var를 다시 선언 할 수 있다고 생각하지 않지만 다른 네임 스페이스에서 선언 할 수 있습니다. 나는 그것을 설명하기 위해 나의 대답을 고쳐 줄 것이다. –

+0

이로 인해 오류가 발생합니다 –

11

String는 당신이 변수에 메소드를 추가 할 수는 없지만, 당신이

interface StringConstructor { 
    isNullOrEmpty(str:string):boolean; 
} 

하고이를 사용하여 인터페이스에 추가 할 수 있습니다

interface StringConstructor { 
    ... 
} 

declare var String: StringConstructor; 

그래서 다음과 같은 인터페이스를 lib.d.ts에 정의되어 있습니다 변수를 사용하여 변수에 구현하기 :

String.isNullOrEmpty = (str:string) => !str; 
+0

ArrayConstructor를 통해 배열 유형에서도 가능합니까? – ndee

+0

정상적으로 작동 할 것이지만, 일반적인 배열'Array '과 비 일반적인'ArrayConstructor'라는 두 개의 인터페이스가 있습니다. – SWeko

+0

이것은 나를 위해 일했다. –

0

솔루션은이 단계에서 string 기본 유형을 확장 할 수 없기 때문에 다른 접근 방식을 사용합니다.

module Type { 
    "use strict"; 

    export module BaseType { 
     export class ApplicationString { 

      /** 
      * Indicates whether the specified string is null or an Empty string. 
      * 
      * @property string inputString 
      * @see https://msdn.microsoft.com/en-us/library/system.string.isnullorempty(v=vs.110).aspx 
      */ 
      static isNullOrEmpty(inputString: string): boolean { 
       if (inputString === null || inputString.length === 0) { 
        return true; 
       } else { 
        return false; 
       } 
      } 
     } 
    } 
} 

alert(Type.BaseType.ApplicationString.isNullOrEmpty(null)); 
alert(Type.BaseType.ApplicationString.isNullOrEmpty("")); 
alert(Type.BaseType.ApplicationString.isNullOrEmpty("text")); 

데모 : TypeScriptPlayground

관련 문제