javascript - Fonksiyon tipi için typescript typeguard metodunu nasıl yazılır


export const isFunction = (obj: unknown): obj is Function => obj instanceof Function;
export const isString = (obj: unknown): obj is string => Object.prototype.toString.call(obj) === "[object String]";

Yazmak istediğim şey isFunction yöntemi - isString'e benzer, ama typescript/eslint bana bir hata veriyor:

Don't use `Function` as a type. The `Function` type accepts any function-like value.
It provides no type safety when calling the function, which can be a common source of bugs.
It also accepts things like class declarations, which will throw at runtime as they will not be called with `new`.
If you are expecting the function to accept certain arguments, you should explicitly define the function shape  @typescript-eslint/ban-types

Bunu yapmanın bir yolu var mı?

Not: İşte cevap:

export const isFunction = (obj: unknown): obj is (...args: any[]) => any => obj instanceof Function;

Cevap #1

Eh, uyarı açık... Bir fonksiyonunuz olduğunu tespit edebilirsiniz, ama parametreler/aritmi/dönüş tipi hakkında pek bir şey çıkaramazsınız. Bu bilgi çalıştırma zamanında mevcut değildir. Bu, fonksiyonu nasıl çağıracağınız veya ne döndürdüğü konusunda (derleme zamanında) emin olamayacağınızı söyler.

Eğer kendinizi bu risk konusunda güvenli hissediyorsanız, uyarıyı devre dışı bırakın.

// tslint:disable-next-line: ban-types yukarıdaki satırda.

Alternatif olarak, (...args:any[]) => any yazmak Function için iyi bir temsilci olabilir, ancak bu tür bir fonksiyon öncekinden daha güvenli değildir.

Cevap #2

Tip koruyucu fonksiyonlarınızı şöyle yaparak CallableFunction arayüzünü kullanmalısınız:

export const isFunction = (obj: unknown): obj is CallableFunction => obj instanceof Function;

Bu şekilde, fonksiyonunuzun türü, yapıcı olanlardan ayrılmış olur (ki bunlar NewableFunction türü ile yazılabilir).

İlgili makaleler