如下:
export interface NameData {
name: string;
}
export interface NickNameData {
nickName: string;
}
export type Without = {
[P in Exclude]?:never
}
export type NameOrNickName = (Without & U) | (Without & T)
const myData1: NameOrNickName = {
name:'张子枫',
nickName:'子枫'
} // fail
const myData2: NameOrNickName = {
name:'张子枫',
} // ok
const myData3: NameOrNickName = {
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
第一种方式比较优雅一点