You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:12:36