Cum să implementezi o interfață TypeScript care are mai multe semnături de apel de funcție


interface SearchFunc {
  (source: string, subString: string): boolean;
 (source: string, subString: string,name:number): boolean;
}

Este posibil să ai o interfață cu mai multe semnături de apel pentru funcții? Dacă da, cum pot să implementez asta? Poți să-mi dai un exemplu relevant? Există cazuri de utilizare pentru asta sau mă gândesc/abordez greșit problema?

Răspuns #1

Iată un exemplu:

interface SearchFunc {
    (source: string, subString: string): boolean;
    (source: string, subString: string, name: number): boolean;
}

const fn: SearchFunc = (source: string, subString: string, name?: number) => true

Dar, în cazul tău, nu ai nevoie de o astfel de interfață. Această tehnică se numește supraincarcare

Supraîncărcările sunt utile dacă aveți anumite constrângeri.

De exemplu, tipul vostru de retur depinde de al treilea argument:

interface SearchFunc {
    (source: string, subString: string): boolean;
    (source: string, subString: string, name: number): string;
}

const fn: SearchFunc = (source: string, subString: string, name?: number) => null as any

const result = fn('sdf','sdf', 2) // string

const result1 = fn('sdf','sdf') // boolean

Sau următorul:

interface SearchFunc {
    (source: string, subString: number): boolean;
    (source: number, subString: string): string;

}

const fn: SearchFunc = (source: string | number, subString: string | number) => null as any

const result = fn('sdf', 2)

const result1 = fn(2, 'sdf')

const result2 = fn(2, 2) // error

const result3 = fn('2', '2') // error

Tipul de funcție permite fn(2, 2), dar interfața nu. Interfața SearchFunc are prioritate mai mare aici.

Argumentele tastate: (source: string | number, subString: string | number) trebuie doar să fie compatibile cu interfața.

Pentru că, conform interfeței source, argumentul ar putea fi fie șir de caractere, fie număr, ar trebui să îl definim și în semnătura funcției ca string | (sau) number