Виджет включает в себя декларации типов, которые должны работать из коробки
import type { Options, Suggestion, SuggestionsType } from "@dadata/suggestions"; const options: Options = {}; |
Объект подсказки - это опциональный generic, по умолчанию типизирован без детализации объекта в поле data
:
type AnyData = { [K: string]: any }; interface Suggestion<T = AnyData> { value: string; unrestricted_value: string; data: T; } |
Передать собственный тип для подсказок можно при инициализации виджета, и этот тип будет распространен на все объекты подсказок в коллбэках и методах этого экземпляра.
interface AddressSuggestion { postal_code: string | null; kladr_id: string | null; ... history_values: string[] | null; } const input = document.getElementById("address") as HTMLInputElement; const suggestions = createSuggestions<AddressSuggestion>(input, { type: "address", onSelect(suggestion) { // suggestion is Suggestion<AddressSuggestion> console.log(suggestion); } }); suggestions.getSuggestions(); // вернет Suggestion<AddressSuggestion>[] |
При изменении опций виджета можно передать новый тип, если нужно на лету изменить тип подсказок:
const suggestions = createSuggestions<AddressSuggestion>(input, options); suggestions.setOptions<NameSuggestion>({ type: "name", onSelect(suggestion) { // suggestion is Suggestion<NameSuggestion> console.log(suggestion); }, }); |
Методы getSelection
, getSuggestions
и getOptions
- тоже позволяют изменить тип подсказки в возвращаемом значении:
const suggestions = createSuggestions<AddressSuggestion>(input, options); suggestions.getSelection<NameSuggestion>(); // Suggestion<NameSuggestion> suggestions.getSuggestions<EmailSuggestion>(); // Suggestion<EmailSuggestion>[] suggestions.getOptions<PartySuggestion>(); // Options<PartySuggestion> |