如何在TypeScript中扩展基础数组类型?需含基础元素且可新增元素
实现TypeScript数组类型的扩展:至少包含基础元素并支持额外元素
针对你对接翻译API的场景,这里提供两种符合需求的类型定义方案,分别对应任意顺序包含基础元素和固定基础元素顺序后追加额外元素的场景:
方案1:任意顺序包含所有基础语言,支持添加其他语言标识
这种方案允许数组中FR和EN以任意顺序出现,同时可以加入任意字符串类型的语言标识,且确保两个基础语言都存在:
const languages = ['FR', 'EN'] as const; // 提取基础语言的元素类型:'FR' | 'EN' type BaseLanguage = typeof languages[number]; // 扩展后的语言元素类型:基础语言 + 任意字符串 type ExtendedLanguage = BaseLanguage | string; // 定义类型约束:确保数组同时包含FR和EN type HasAllBaseLanguages<T extends readonly ExtendedLanguage[]> = T extends readonly [...infer _, 'FR', ...infer __] ? T extends readonly [...infer _, 'EN', ...infer ___] ? T : never : never; // 最终的扩展数组类型 type ExtendedLanguagesArray = HasAllBaseLanguages<readonly ExtendedLanguage[]>;
验证示例
// 合法:包含FR和EN,顺序任意,可加其他元素 const valid1: ExtendedLanguagesArray = ['FR', 'EN']; const valid2: ExtendedLanguagesArray = ['EN', 'FR', 'DE']; const valid3: ExtendedLanguagesArray = ['ES', 'FR', 'EN', 'IT']; // 不合法:缺少任一基础语言 const invalid1: ExtendedLanguagesArray = ['EN', 'DE']; // 类型报错 const invalid2: ExtendedLanguagesArray = ['FR', 'ES']; // 类型报错
方案2:固定基础语言顺序,后续追加额外元素
如果你的业务场景要求数组必须以FR、EN为前缀,之后再添加其他语言标识,可以用更简洁的类型定义:
const languages = ['FR', 'EN'] as const; // 扩展数组类型:基础数组元素在前,后面可追加任意字符串元素 type ExtendedLanguagesArray = [...typeof languages, ...string[]];
验证示例
// 合法:以FR、EN开头,后续可加任意元素 const valid: ExtendedLanguagesArray = ['FR', 'EN', 'DE', 'ES']; // 不合法:基础元素顺序错误或缺失 const invalid1: ExtendedLanguagesArray = ['EN', 'FR']; // 类型报错 const invalid2: ExtendedLanguagesArray = ['FR', 'DE']; // 类型报错
内容的提问来源于stack exchange,提问作者Auloma
相关产品推荐
相关产品推荐

