Avatar ·

TypeScript: 如何创建必须包含两个属性之一的接口?

大家好!我正在用 TypeScript 编写一个订单处理应用。我有一个用户接口,用户可以是已注册的(此时有 `userId`),也可以是访客(此时有 `guestToken`)。但最重要的是,用户必须恰好拥有这两个字段中的一个,而不是同时拥有两个或一个都没有。 我尝试了以下方式: ```typescript interface User { name: string; email: string; userId?: number; guestToken?: string; } ``` 但问题在于,TypeScript 允许创建两个字段都缺失或同时存在的对象。例如: ```typescript const user1: User = { name: "安娜", email: "a@mail.ru" }; // 既没有 userId 也没有 guestToken — 没有报错 const user2: User = { name: "伊万", email: "i@mail.ru", userId: 123, guestToken: "abc" }; // 两个字段都存在 — 也没有报错 ``` 我需要编译器严格检查:要么有 `userId`(且没有 `guestToken`),要么有 `guestToken`(且没有 `userId`)。