如何定义TypeScript类型以支持字符串或单like/in键的对象值?
解决TypeScript类型定义问题
你遇到的错误原因是:Record<"like" | "in", string>会强制要求对象同时包含like和in两个属性,但你的需求是允许对象仅包含其中一个,或者直接用字符串作为属性值,所以原类型定义不符合预期。
正确的类型定义方式
你需要将对象部分定义为仅含like或仅含in的对象联合类型,结合字符串类型,最终的类型可以这样写:
// 先定义单个属性值的合法类型 type ValidValue = string | { like: string } | { in: string }; // 再定义最终的对象类型 type ValidObject = Record<string, ValidValue>;
或者更紧凑的写法:
type ValidObject = Record<string, string | { like: string } | { in: string }>;
验证示例
用这个类型定义后,你给出的所有示例都会被TypeScript判定为合法:
// 合法 const obj1: ValidObject = {key: { like: "xxxx"}}; // 合法 const obj2: ValidObject = {key: {in: "xxxx"}}; // 合法 const obj3: ValidObject = {key1: { like: "xxxx"}, key2: {in: "xxxxx"}, key3: "xxx"}; // 合法 const obj4: ValidObject = {key1: "xxx", key2: {like: "xxxxx"}}; // 合法 const obj5: ValidObject = {key: "xxx"};
如果你的需求允许对象同时包含like和in(示例中未涉及这种场景),可以将对象部分改为可选键的类型,但需要确保至少有一个键存在:
type ValidValue = string | ({ like?: string; in?: string } & ({} extends { [K in keyof Omit<{like: string, in: string}, keyof infer T>]?: never } ? never : {}));
不过这种场景更复杂,如果你不需要支持同时包含两个键的情况,前面的简单联合类型就足够满足需求。
内容的提问来源于stack exchange,提问作者VusalIs
相关产品推荐
相关产品推荐

