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
