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 として宣言されているため、明らかに私の答えは完全ではありません。宣言のマージは (0.9 の時点で) vars に引き継がれず、面倒です。ちょっとしたハックですが、これを回避する方法はまだあります。

// 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 に加えて追加したものと共に存在することを宣言しています。次に、 で作業している限り、mysnamespaceString への参照は、 について話していると見なされますmynamespace.String。それは実際には存在しないので、必要な古き良き文字列を取得できます。

私が言ったように、少し汚れていますが、まともな名前空間の規則に従っていると仮定すると、これを一度だけ行う必要があるトップレベルの名前空間が必要です。ただし、ライブラリの一部として 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 に答える