据我所知,你无法在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;
}
如何声明静态扩展名?
答案 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委员会并要求他们添加它。除此之外,请单独留下内置类型。他们的生活很艰苦。