Вы можете использовать условные типы для обеспечения того, что тип в chatPayload
совпадает с типом в chatPayload.options
.
ChatPayload может принимать в качестве параметра типа «тип» "из API:
interface ChatPayload<Type extends ChatTypes> {
type: Type;
options: Type extends "articles" ? OptionArticles : Type extends "params" ? OptionParams : OptionText ;
confidence?: number;
gotAllParams?: boolean;
}
И вы можете переключать тип в зависимости от значения поля в ответе API:
// the response you get from the API; you don't know the type yet
const apiResponse: any = {}
if (apiResponse.type === "text" || apiResponse.type === "date") {
doSomething(apiResponse as ChatPayload<"text" | "date">)
} else if (apiResponse.type === "articles") {
doSomething(apiResponse as ChatPayload<"articles">)
} else if (apiResponse.type === "params") {
doSomething(apiResponse as ChatPayload<"params">)
} else {
throw new Error("unexpected type")
}
Приведение немного уродливо, но вы придется использовать приведение, чтобы получить нетипизированный ответ API на один из ваших собственных типов.
Для дополнительной безопасности вы можете использовать валидатор JSON, чтобы убедиться, что ответ, который вы получаете от API соответствует тому, что вы ожидаете.
Машинописная игровая площадка