В последних версиях машинописного текста (3.2 или 3.3 не уверены, какие именно), когда вы объявляете функцию, вы также можете назначить дополнительные свойства функции, и машинописный текст будет рассматривать их как определение этих свойств и не будет жаловаться на то, что они не были определены:
export interface Foo<T> {
(arg: T): T;
doFoo(): this;
}
function foo(arg: number) : number {
return arg
}
foo.doFoo = function <TThis extends typeof foo>(this: TThis): TThis { // no polymorphic this in simple functions
return this
}
let o: Foo<number> = foo; // foo is compatible with Foo<number>
Старый делал это, который все еще работает, использует Object.assign
для создания функции с дополнительными свойствами:
let o: Foo<number> = Object.assign(function (arg: number): number {
return arg
}, {
doFoo: function <TThis>(this: TThis): TThis {
return this
}
})