Typescript'te, mevcut bir nesneden "type" tanımlamak mümkün mü?


Diyelim ki, benim böyle bir fonksiyonum var:

function plus(a: number, b: number) { return a + b }

Elbette, türü Typescript'te bir fonksiyon olarak (a: number, b: number) => number.

Eğer bu fonksiyonu türünü gerçekten belirtmeden başka bir fonksiyon için bir "argüman" olarak kullanmak istersem, varsayılan argüman hilesini kullanabilirdim:

function wrap(fn = plus) { ... }

Eğer bunun varsayılan argüman olmasını istemiyorsam, tipini açıkça belirtmenin dışında başka bir seçeneğim var mı?

Kısacası, bu function wrap(fn: (a: number, b: number) => number) { ... } istemiyorum, ama şöyle bir şey istiyorum function wrap(fn: like(plus)) { ... }.

Cevap #1

@OweR ReLoaDeD sayesinde, type fn=typeof plus geçerli bir ifade, bu yüzden bu çalışır:

function plus(a: number, b: number) { return a + b }
function wrap(fn: typeof plus) { }

Cevap #2

Generik kullanımı hakkında ne düşünüyorsunuz:

function plus(a: number, b: number) { return a + b }

function wrap<T extends Function>(fn: T) {
    fn();
}

// Works 
var wrappedPlus = wrap<typeof plus>(plus);

// Error: Argument of type '5' is not assignable to parameter of type '(a: number, b: number) => number'.
var wrappedPlus = wrap<typeof plus>(5);

// Error: Argument of type '5' is not assignable to parameter of type 'Function'.
var wrappedPlus = wrap(5);

function concat(a: string, b: string) { return a + b }

// Error: Argument of type '(a: number, b: number) => number' is not assignable to parameter of type '(a: string, b: string) => string'.
var wrappedPlus = wrap<typeof concat>(plus);

İlgili makaleler