将原生JS对象的扩展暴露给打字稿?

时间:2014-04-04 21:33:49

标签: javascript typescript

据我所知,你无法在TypeScript(TS)中扩展像Array和String这样的本机类型。我有一些使用纯JS编写的小扩展,我想向TS公开。例如:

Array.prototype.first = function(testFunction) {
    if( typeof(testFunction) !== 'function' ) {
        return null;
    }

    var result = null;
    this.forEach(function(item){
        if( testFunction(item) ) {
            result = item;
            return;
        }
    });
    return result;
};

这是在Array.js中。我该如何揭露“第一个'功能到TS。

我尝试创建一个包含以下内容的Extensions.d.ts文件:

export declare var Array: {
    findItem(callback: Function);
}

然后在我的app.ts中引用该声明:

/// <reference path="Extensions.d.ts" />

var x: string[] = new Array();
x.first(function (x) { return false; });

但app.ts似乎并不了解first()函数。

这可能吗?

编辑:好的,我的.d.ts文件中似乎需要这个:

interface Array<T> {
    first(callback: (Function : T) => boolean) : T;
}

所以我想我只需要回答以下问题。考虑:

String.format = function () {
    var formatString = arguments[0];
    if( arguments.length < 2 ) {
        return formatString;
    }
    var args = Array.prototype.slice.call(arguments, 1);
   //do formatting here
   return result;
}

如何声明静态扩展名?

3 个答案:

答案 0 :(得分:1)

  

如何声明静态扩展名?

使用module

module String{
    export var format = function (...args:any[]) {
    var formatString = arguments[0];
    if( arguments.length < 2 ) {
        return formatString;
    }
    var args = Array.prototype.slice.call(arguments, 1);
   //do formatting here
   return result;
}

String.format();

答案 1 :(得分:0)

  

如何声明静态扩展名?

因为可以轻松添加TypeScript 1.4静态扩展。 TypeScript团队更改了lib.d.ts文件,以便为所有静态类型定义使用接口。

静态类型定义的名称类似于[Type]Constructor:因此,如果要添加静态函数以键入String,请将定义添加到StringConstructor

定义:

interface StringConstructor
{
    format(s: string, ...args: any[]): string;
}

实现:

String.format = function(s: string, ...args: any[]): string
{
    // your implementation here
    return "yourFormattedString";
}

用法:

var s: string = String.format("Hello, {0}", "World");

答案 2 :(得分:-1)

添加内置类型的扩展程序故意很难,因为它确实是一个坏主意。

当您的组件添加一个名为String.format的函数并且其他人编写一个添加了名为String.format且具有不同行为的组件的组件时会发生什么?最后的胜利,计划随机破裂,随之而来的是混乱。最好的情况是它们如此不同以至于您的程序立即失败;最坏的情况是你的程序开始巧妙地破坏数据,因为它希望String.format做一件事,但它做了一些略微不同的事情(例如,舍入浮点数而不是截断)。

如果您有足够的信心,确定了String.format应该是绝对正确的版本,并且没有其他使用您的代码的人或您使用的代码以同样的方式思考,那么自己修改 lib.d.ts 并在项目中使用它。当您遇到其他想要使用自定义lib.d.ts的其他(TypeScript)项目时,您可以协调这些差异并确定您是否认为String.format会很好,但是创建了竞争实现(因为每个要求此功能的人都想要一个名为String.format的东西,你可以假设发生)。

如果您认为String应该有一个名为format的方法,那么最好的做法是联系ECMAScript委员会并要求他们添加它。除此之外,请单独留下内置类型。他们的生活很艰苦。