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`)。