TypeScript将静态助手添加到现有类的原型中

时间:2015-10-14 07:56:23

标签: javascript typescript prototype

这主要是关于如何使用static自定义方法添加/扩展任何现有类型的问题。

我希望将String原型扩展为一个函数,例如应isNullOrEmpty方式调用C#

if(!String.isNullOrEmpty(myStringToCheck)){
    // do things as of myStringToCheck is set to something
}

在简单的javascript中我可以做类似

的事情
String.isNullOrEmpty = function (s) {
    if (s == null || s === "")
        return true;

    return false;
}

但是,当在TypeScript中调用它时,它会告诉我

  

属性'isNullOrEmpty'不存在于类型'{prototype:String; fromCharCode(... codes:number []):string; (值?:any):string; new(value?:any):String; }”。

如何做到这一点,以便TypeScript知道?

编辑#1

String.fromCharCode()如何实现TypeScript

编辑#2

由于项目中的其他依赖项,我目前只允许使用TypeScript 1.0

编辑#3

String.d.ts

interface StringConstructor {
    isNullOrEmpty(): boolean;
}

interface String {
    format(...args: any[]): string;
    isNullOrEmpty(): boolean;
} 

和我的String.ts

/// <reference path="../../../typings/String.d.ts"/>

String.prototype.format = function (): string {
    var formatted = this;
    for (var i = 0; i < arguments.length; i++) {
        var regexp = new RegExp("\\{" + i + "\\}", "gi");
        formatted = formatted.replace(regexp, arguments[i]);
    }
    return formatted;
}

String.isNullOrEmpty = function(s) { <-- here is the exception
    if (s == null || s === "")
        return true;
    return false;
}

解决方案#1 TypeScript版本&gt; 1.0?)

  

请参阅MartyIX的第一个答案

解决方案#2 TypeScript版本1.0的解决方法)

  

见第二个答案

2 个答案:

答案 0 :(得分:2)

// String.ts
interface StringConstructor {
    isNullOrEmpty(text: string): boolean;
}

interface String {
    isNullOrEmpty(text: string): boolean;
}

String.isNullOrEmpty = (s:string):boolean => {
    return (s == null || s === "");
};

// OtherFile.ts
///<reference path="path/to/String.ts" />

if(!String.isNullOrEmpty("test")){
    // Do something
}

var isEmpty = String.fromCharCode(100).isNullOrEmpty("Nah");

这对我有用。界面扩展StringConstructor

答案 1 :(得分:1)

正如来自@MartyIX的评论一样,TypeScript 1.0似乎存在问题。 作为一种解决方法,我已经为String的原型添加了一种方法:

String.d.ts(定义)

interface String {
    isNullOrEmpty(text: string): boolean;
} 

String.ts(实施)

String.prototype.isNullOrEmpty = function(text) => {
    if (text == null || text === "")
        return true;

    return false;
}

可以使用

if(!String.prototype.isNullOrEmpty(myStringToCheck)){
    // do things as of myStringToCheck is set to something
}