8

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

这样我就可以称之为:

String.isNullOrEmpty(myobj);

我找到了一种将其放在实现上的方法,但这对诸如此类的方法没有帮助。

4

3 回答 3

16

Stringlib.d.ts使用以下接口定义

interface StringConstructor {
  ...
}

declare var String: StringConstructor;

因此,虽然您不能将方法添加到变量中,但您可以将它们添加到接口中,使用

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

他们在变量上实现它们,使用

String.isNullOrEmpty = (str:string) => !str;
于 2015-08-21T15:29:00.243 回答
6

TypeScript 做了一种叫做声明合并的事情,这在规范的第 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 而不是模块。声明合并不会延续到 vars(从 0.9 开始),这很烦人。仍然有一种方法可以解决这个问题,尽管它有点像 hack:

// 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. 那并不存在,所以你会得到你想要的很好的字符串。

就像我说的那样,它有点脏,但是假设你遵循了不错的命名空间约定,你应该有一个顶级命名空间,你只需要这样做一次。但是,如果您想将字符串扩展作为库的一部分共享……那么您就被卡住了。

于 2013-07-24T22:29:23.707 回答
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

于 2015-12-06T12:30:14.497 回答