如何从字段多变的REST API取数并进行TypeScript类型定义?
问题解答
一、nativeName的类型定义与取值
类型定义修正
你原来的类型固定了子字段名称(var1/var2),无法适配动态变化的键名。正确做法是用索引签名描述这类键名不固定、值结构统一的对象:
type Country = { name: { common: string; official: string; nativeName: { // 任意字符串键,对应值都是包含official和common的对象 [langCode: string]: { official: string; common: string; }; }; }; };
也可以用TypeScript内置的Record类型简化,效果完全一致:
type NativeNameEntry = { official: string; common: string }; type Country = { name: { common: string; official: string; nativeName: Record<string, NativeNameEntry>; }; };
获取第一个nativeName的common值
先提取nativeName的所有值组成数组,再取第一个元素的common属性:
// 假设countries是API返回的数组,类型为Country[] const firstNativeCommon = Object.values(countries[0].name.nativeName)[0]?.common;
用?.可选链操作符可避免nativeName为空对象时触发报错。
二、languages字段的类型定义
languages是键名动态、值为字符串的结构,直接用索引签名或Record类型即可:
索引签名写法
type Languages = { [langCode: string]: string; };
Record简化写法
type Languages = Record<string, string>;
如果要整合到Country类型中,可标记为可选字段(适配部分国家无语言数据的情况):
type Country = { name: { /* ... 原有定义 ... */ }; languages?: Record<string, string>; };
内容的提问来源于stack exchange,提问作者badakzz
相关产品推荐
相关产品推荐

