TypeScript扩展String Static

时间:2013-07-24 19:30:45

标签: typescript

有没有办法将isNullOrEmpty(str:string)添加到静态字符串对象。

这样我可以称之为:

String.isNullOrEmpty(myobj);

我找到了一种方法将它放在实现上,但这对于像这样的方法没有帮助。

3 个答案:

答案 0 :(得分:14)

Stringlib.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

Try it out


显然我的答案不完整,因为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"));

演示:TypeScriptPlayground