TypeScript 如何实现一个二选一的 interface?
TypeScript 如何约束一个 interface ,其中的两个值为2选一,
(不能都存在,也不能都不存在)
如下:
export interface MockData { name: string;
nickName: string;
}
这个 interface 目前并不符合我的需求,我的需求是 name 或者 nickName 二选一,该如何改造?或者如何实现呢?
回答:
如下:
typescript">export interface NameData { name: string;
}
export interface NickNameData {
nickName: string;
}
export type Without<T,U> = {
[P in Exclude<keyof T, keyof U>]?:never
}
export type NameOrNickName<T,U> = (Without<T,U> & U) | (Without<U,T> & T)
const myData1: NameOrNickName<NameData, NickNameData> = {
name:'张子枫',
nickName:'子枫'
} // fail
const myData2: NameOrNickName<NameData, NickNameData> = {
name:'张子枫',
} // ok
const myData3: NameOrNickName<NameData, NickNameData> = {
nickName:'子枫'
} // ok
等同于:
export interface NameDataNoNickName {
name: string;
nickName?:never;
}
export interface NickNameDataNoName {
nickName: string;
name?:never
}
export type NameOrNickName2 = NameDataNoNickName | NickNameDataNoName
const omyData1: NameOrNickName2 = {
name:'张子枫',
nickName:'子枫'
} // fail
const omyData2: NameOrNickName2 = {
name:'张子枫',
} // ok
const omyData3: NameOrNickName2 = {
nickName:'子枫'
} // ok
第一种方式比较优雅一点
回答:
用Union Types
export type MockData = { name: string;
} | {
nickName: string;
};
回答:
https://github.com/maninak/ts-xor
npm包ts-xor引入了新的映射类型XOR,它可以帮助你构建包含互斥对象键的自定义TypeScript类型。
以上是 TypeScript 如何实现一个二选一的 interface? 的全部内容, 来源链接: utcz.com/p/935165.html