typescript - Typescript 是否支持互斥类型?

标签 typescript

我有一个接受参数的方法。我希望 Typescript 验证传入的对象(在 Typescript 编译时,我知道运行时是另一种动物)仅满足一个允许的接口(interface)。

例子:

interface Person {ethnicity: string;}
interface Pet {breed: string;}
function getOrigin(value: Person ^ Pet){...}

getOrigin({}); //Error
getOrigin({ethnicity: 'abc'}); //OK
getOrigin({breed: 'def'}); //OK
getOrigin({ethnicity: 'abc', breed: 'def'});//Error

我意识到 Person ^ Pet 不是有效的 Typescript,但这是我首先想到的,而且看起来很合理。

最佳答案

this issue 中所提议, 你可以使用 conditional types编写异或类型:

type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
type XOR<T, U> = (T | U) extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;

现在你的例子有效了:

interface Person {ethnicity: string;}
interface Pet {breed: string;}
function getOrigin(value: XOR<Person, Pet>) { /* ... */}

getOrigin({}); //Error
getOrigin({ethnicity: 'abc'}); //OK
getOrigin({breed: 'def'}); //OK
getOrigin({ethnicity: 'abc', breed: 'def'});//Error

关于typescript - Typescript 是否支持互斥类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42123407/

相关文章:

angular - 在 Angular 7 中将数据恢复为 react 形式

javascript - typescript 和 d3 版本 v3 中的可折叠树

javascript - 如何使用 TypeScript 停止 d3 中的事件传播?

javascript - 使用 async/await/Promises 在 JavaScript/TypeScript 中实现事件同步原语

reactjs - React TSX 文件中的泛型

typescript - 更新来自处理响应延迟和其他错误的 Web 服务的数据

javascript - 在 TypeScript 中生成整数数组

javascript - 如何在可重用的 React 组件库中捆绑 prop 类型

angular - 如何将一种类型的 Observable 转换为另一种类型的 Observable

typescript - 使用 Cypress Typescript 类型