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.
