TYpescript : Function as class 上的静态方法
TYpescript : Static methods on Function as class
我有一个 fn
继承了现有的 fn
(以 Angular1 $q 为例)
//$q original behavior
var defer = $q.defer();
defer.promise.then(function(result){})
//or
$q( (resolve, reject) => {
//promise execution here
}).then(function(result){});
如果我想装饰它,我会这样做:
var Qdecorator = function($delegate) {
var Q = function(resolver:any): any {
//do some extra stuff here
return $delegate.apply($delegate, arguments);
}
//Assign the static methods here:
Q.defer = function() {
//do some stuff
return $delegate.defer.apply($delegate, []);
}
//same goes for race, when, resole reject and so on
return Q;
}
问题是打字稿抱怨
属性 defer
, race, when, resolve, etc...
does not exist on type '(resolver: any) => any'
我尝试使用 IQService
和 IPromise
但没有成功,但是我想提出一个更全局的问题:
如何在不使用 new
的 return 对象的 function() 上定义后期静态方法
我正在从这个 link 复制粘贴我的问题的答案:
https://www.typescriptlang.org/docs/handbook/interfaces.html
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
我有一个 fn
继承了现有的 fn
(以 Angular1 $q 为例)
//$q original behavior
var defer = $q.defer();
defer.promise.then(function(result){})
//or
$q( (resolve, reject) => {
//promise execution here
}).then(function(result){});
如果我想装饰它,我会这样做:
var Qdecorator = function($delegate) {
var Q = function(resolver:any): any {
//do some extra stuff here
return $delegate.apply($delegate, arguments);
}
//Assign the static methods here:
Q.defer = function() {
//do some stuff
return $delegate.defer.apply($delegate, []);
}
//same goes for race, when, resole reject and so on
return Q;
}
问题是打字稿抱怨
属性 defer
, race, when, resolve, etc...
does not exist on type '(resolver: any) => any'
我尝试使用 IQService
和 IPromise
但没有成功,但是我想提出一个更全局的问题:
如何在不使用 new
我正在从这个 link 复制粘贴我的问题的答案: https://www.typescriptlang.org/docs/handbook/interfaces.html
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;