2014-04-04 39 views
0

我知道你不能在TypeScript(TS)中擴展像Array和String這樣的本機類型。我有一些使用純JS編寫的小擴展,我想向TS公開。例如:將原生JS對象的擴展公開給打印機?

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不似乎知道第一個()函數。

這可能嗎?

編輯:好吧,看來我需要這在我的.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; 
} 

如何聲明靜態擴展名?

+0

可能重複(http://stackoverflow.com/questions/ 12802383 /擴大陣列在打字稿) – WiredPrairie

回答

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"); 
+1

很抱歉,Visual Studio CTP 6(2月23日發佈)說這是一個錯誤。 'StringConstructor'類型上不存在屬性'格式' –

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

添加功能擴展內置類型是故意困難,因爲它真的是一個壞主意。

當你的組件添加了一個名爲String.format功能和別人編寫,增加了一些所謂的String.format具有不同的行爲組件,會發生什麼?最後勝利,節目隨機破解,隨之出現混亂。最好的情況是他們如此不同以至於你的程序立即失敗;最糟糕的情況是,你的程序開始微妙地破壞數據,因爲它期望String.format做一件事,但它做了一些稍微不同的事情(例如舍入浮點數而不是截斷)。

如果你有足夠的信心,你已經確定什麼String.format應該是絕對的,正確的版本,並沒有其他人誰使用你的代碼或者其代碼使用表裏如一,然後修改lib.d .ts你自己並在你的項目中使用它。當你遇到一些想要使用自定義lib.d.ts的其他(TypeScript)項目時,那麼你可以調和這些差異,並確定你是否已經決定String.format會很高興,但已經創建了競爭實現(因爲每個人誰要求這個功能想要叫做String.format,你可以假設這個會發生)。

如果您認爲String應該有一個名爲format的方法,最好的方法是聯繫ECMAScript委員會並要求他們添加它。簡而言之,請單獨留下內置類型。他們的生活已經夠艱難了。

+0

這可能是一個更好的評論比答案(沒有我沒有投票) 。但無論如何,是的,我意識到我正在做的所有壞事。但它是應用程序代碼,我不會導出。我想與.Net命名相似。但是你是正確的,真的沒有任何正當的理由,我不能只在我的String.format的地方放MyFavouriteString.format在我的代碼。但是當我在代碼中看到它時,總會讓我覺得所有的字符串都應該封裝,使用兩種類型出於同樣的目的感覺很奇怪。但這是思考的食物,我同意你的觀點。 – sheamus