typescript - Birlik tipi (Function | RegExp) için tip güvenliği çalışmıyor


Bu kod derleme hatasına neden oluyor gibi görünüyor (TypeScript 1.6.2 ile kontrol edildi):

var a: ((input: any) => boolean) | string | RegExp = "foobar";
if (typeof a === 'function') {
    a(100); // compile error here
}

Derleyici şunu söylüyor: error TS2349: Çağrı imzası olmayan bir ifadeyi çağırmak mümkün değil.

Bunu TS Playground'a girdim ve if bloğu içinde a'nın türünün ((input: any) => boolean) | RegExp olduğunu gördüm, bu beklediğim bir şey değildi. Tabii ki typeof /abc/ 'object' döndürdüğü için, bence a if bloğunda asla bir düzenli ifade olmamalı.

Sanırım bu bir şekilde bu sorun ve "agresif alt tip azaltımı" ile ilgili, ama bundan emin değilim.

Açık tip belirtimi ((<Function>a)(100)) sorunumuzu çözmedi. Hızlı bir çözüm yolu var mı?

DÜZENLE: Bu sorunun yalnızca 1.6’ya özgü bir sorun olmadığı ortaya çıktığı için soruyu güncelledim.

Cevap #1

Düzenleme: typeof kullanan fonksiyonlardaki tür koruyucuları TS 2.0+ sürümlerinde çalışmaktadır. Bu artık bir sorun olmamalıdır.

Aşağıdaki konuda belirtildiği gibi, şu anda desteklenen yöntem instanceof kullanmaktır...

var a: ((input: any) => boolean) | string | RegExp = "foobar";

if (a instanceof Function) {
    a(100); // ok
}

Ancak, #4868'de typeof kullanımını destekleme hakkında bazı yeni tartışmalar var.

Orijinal Cevap

Söylediğin şey bana bir hata gibi görünüyor.

Şimdilik, kullanıcı tanımlı bir tür koruyucu kullanabilirsiniz:

function isFunction(obj: any) : obj is Function {
    return typeof obj === "function";
}

if (isFunction(a)) {
    a(10);
}

Veya herhangi bir tipe atıfta bulunun ve ardından fonksiyonun tipine atıfta bulunun:

(a as any as (input: any) => boolean)(100);

Bunu sormak için #4850 numaralı konuyu açtım.

İlgili makaleler