ser*_*0ne 14 javascript prototype typescript
我最近问了一个关于TypeScript在JavaScript API中扩展现有原型的能力的问题(这里:使用TypeScript扩展Object.prototype).
事实证明这是一个bug,从那时起就被解决了TypeScript 0.9.0 Alpha(现在包括泛型...... GREAT :-))
在TypeScript中,接口是开放式的,因此如果查看lib.d.ts,您将找到一个定义JavaScript的Object API合约的接口.您还应该看到Object的变量声明,它定义了Object的静态函数.
为简单起见,这里它们是:
//Pulled from lib.d.ts
interface Object {
toString(): string;
toLocaleString(): string;
valueOf(): Object;
hasOwnProperty(v: string): bool;
isPrototypeOf(v: Object): bool;
propertyIsEnumerable(v: string): bool;
[s: string]: any;
}
declare var Object: {
new (value?: any): Object;
(): any;
(value: any): any;
prototype: Object;
getPrototypeOf(o: any): any;
getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
getOwnPropertyNames(o: any): string[];
create(o: any, properties?: PropertyDescriptorMap): any;
defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
defineProperties(o: any, properties: PropertyDescriptorMap): any;
seal(o: any): any;
freeze(o: any): any;
preventExtensions(o: any): any;
isSealed(o: any): bool;
isFrozen(o: any): bool;
isExtensible(o: any): bool;
keys(o: any): string[];
}
Run Code Online (Sandbox Code Playgroud)
所以,我之前的问题是关于扩展Object的接口,如下所示:
interface Object {
GetFoo(): Foo;
}
Object.prototype.GetFoo = function() {
return new Foo();
}
Run Code Online (Sandbox Code Playgroud)
如上所述,这适用于TypeScript 0.9.0.
但现在我也希望能够向Object添加静态函数,在纯JavaScript中完全合法.
在JavaScript中我会这样做:
Object.FooAgain = function () {
// Yes, it's foo again!
}
Run Code Online (Sandbox Code Playgroud)
但我似乎无法在TypeScript中完成此任务.
首先,我试着看看Object的声明是否是开放的(与接口一样):
declare var Object: {
FooAgain(): void;
}
Object.FooAgain = function () {
// TS doesn't like this, and Object.FooAgain isn't available in intellisense.
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过(我在另一篇文章中看到了这一点,并认为值得一试).
export declare var Object: {
}
Run Code Online (Sandbox Code Playgroud)
但这似乎打破了一切......
不可否认,这个问题也可能已经在TS 0.9.0中得到修复(我正在工作,所以我还没有完全尝试过).
任何人都可以对此有所了解吗?
Ste*_*orn 14
由于可以轻松添加TypeScript 1.4静态扩展.TypeScript团队将lib.d.ts文件更改为使用所有静态类型定义的接口.
静态类型定义都命名为[Type]Constructor:所以如果要添加静态函数来键入Object,则将定义添加到ObjectConstructor.
定义:
interface ObjectConstructor
{
FooAgain(): void;
}
Run Code Online (Sandbox Code Playgroud)
执行:
Object.FooAgain = function(): void
{
// Oh noes, it's foo again!
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10503 次 |
| 最近记录: |