정적 문자열 개체에 isNullOrEmpty (str : string)를 추가하는 방법이 있습니까?TypeScript extends String 정적
같은 내가 그것을 호출 할 수 있습니다 :
String.isNullOrEmpty(myobj);
내가 구현에 넣어하는 방법을 발견하지만이 이와 같은 방법에 대한 도움이되지 않습니다.
정적 문자열 개체에 isNullOrEmpty (str : string)를 추가하는 방법이 있습니까?TypeScript extends String 정적
같은 내가 그것을 호출 할 수 있습니다 :
String.isNullOrEmpty(myobj);
내가 구현에 넣어하는 방법을 발견하지만이 이와 같은 방법에 대한 도움이되지 않습니다.
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 확장을 공유하려는 경우 ... 잘 붙어 있습니다.
놀이터에서 예상대로 작동하지만 두 개의 TS 파일로 분리하고 string.d.ts를 참조하면 예상대로 사용할 수 없습니다. – maxfridbe
아 맞습니다. lib.d.ts 문자열에있는 문제는 모듈 대신 var로 선언됩니다 (병합에 적합하지 않음). 동일한 네임 스페이스에서 var를 다시 선언 할 수 있다고 생각하지 않지만 다른 네임 스페이스에서 선언 할 수 있습니다. 나는 그것을 설명하기 위해 나의 대답을 고쳐 줄 것이다. –
이로 인해 오류가 발생합니다 –
String
는 당신이 변수에 메소드를 추가 할 수는 없지만, 당신이
interface StringConstructor {
isNullOrEmpty(str:string):boolean;
}
하고이를 사용하여 인터페이스에 추가 할 수 있습니다
interface StringConstructor {
...
}
declare var String: StringConstructor;
그래서 다음과 같은 인터페이스를 lib.d.ts
에 정의되어 있습니다 변수를 사용하여 변수에 구현하기 :
String.isNullOrEmpty = (str:string) => !str;
솔루션은이 단계에서 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
는 단순히 '사용할 수없는 이유가 있나요'연산자!? 예를 들면 :'if (! str) {...}? ' – jsalonen
대부분이 예제로 이것을 사용하고 있습니다. – maxfridbe
예제는 무엇입니까?빈 문자열을 검사하는 방법에 특히 관심이 있습니까? 아니면 문자열과 같은 기존 객체를 확장하는 일반적인 방법을 원하십니까? – jsalonen