有没有办法将isNullOrEmpty(str:string)添加到静态字符串对象。
这样我可以称之为:
String.isNullOrEmpty(myobj);
我找到了一种方法将它放在实现上,但这对于像这样的方法没有帮助。
答案 0 :(得分:14)
String
在lib.d.ts
中定义,具有以下界面
interface StringConstructor {
...
}
declare var String: StringConstructor;
因此,虽然您无法向变量添加方法,但可以使用
将它们添加到界面中interface StringConstructor {
isNullOrEmpty(str:string):boolean;
}
他们使用
在变量上实现它们String.isNullOrEmpty = (str:string) => !str;
答案 1 :(得分:4)
TypeScript执行称为声明合并的操作,这在the spec的第10.5节中进行了解释。
它的要点是你可以把成员放在模块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
显然我的答案不完整,因为String被声明为var而不是模块。声明合并不会延续到令人讨厌的变量(从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
}
filea
中发生的事情是你在var String上放了一个函数,然后声明mynamespace.String
存在,lib.d.ts中的所有String都加上你添加的内容。然后,只要你在mysnamespace
工作,对String的引用就会假设你在谈论mynamespace.String
。这并不存在,所以你会得到你想要的好的字符串。
就像我说它有点脏,但假设你正在追随体面namespace conventions,你应该有一个顶级命名空间,你只需要这样做一次。如果你想将String扩展作为库的一部分共享,那么......你就会陷入困境。
答案 2 :(得分: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"));