当前位置: 首页 > 知识库问答 >
问题:

javascript - TypeScript 如何实现一个二选一的 interface?

杜曜灿
2023-11-22

TypeScript 如何约束一个 interface ,其中的两个值为2选一,
(不能都存在,也不能都不存在)

如下:

export interface MockData {  name: string;  nickName: string;}

这个 interface 目前并不符合我的需求,我的需求是 name 或者 nickName 二选一,该如何改造?或者如何实现呢?

共有2个答案

景信瑞
2023-11-22

如下:

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:'子枫'} // failconst myData2: NameOrNickName<NameData, NickNameData> = {  name:'张子枫',} // okconst myData3: NameOrNickName<NameData, NickNameData> = {  nickName:'子枫'} // ok

等同于:

export interface NameDataNoNickName {  name: string;  nickName?:never;}export interface NickNameDataNoName {  nickName: string;  name?:never}export type NameOrNickName2 = NameDataNoNickName | NickNameDataNoNameconst omyData1: NameOrNickName2 = {  name:'张子枫',  nickName:'子枫'} // failconst omyData2: NameOrNickName2 = {  name:'张子枫',} // okconst omyData3: NameOrNickName2 = {  nickName:'子枫'} // ok

第一种方式比较优雅一点

应志用
2023-11-22

https://github.com/maninak/ts-xor
npm包ts-xor引入了新的映射类型XOR,它可以帮助你构建包含互斥对象键的自定义TypeScript类型。

 类似资料:
  • 要求是这样的(目前的话换行单选多选判断换行展示已经处理完了): 但是现在有个问题就是选项的个数问题,选项最多是9个(也就是从A~I),最少是3~4个(判断的选项就是两个,但是若遇到判断就换行了,倒是不用太操心),选项个数不固定每题的宽度就不固定,宽度不固定列数就不固定,列数有影响到了行数,但又要求每列得对齐。 大致就是: 1.选项个数不固定 2.支持横排、竖排的切换 3.每列得对齐 所以想问问各位

  • zrender绘制成功后,不知道缩略图怎么实现,没有思路主要,想问问大概是怎么个思路

  • 本文向大家介绍如何简单的实现一个promise?相关面试题,主要包含被问及如何简单的实现一个promise?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先明确什么是promiseA+规范,参考规范的地址:primise A+规范 如何实现一个promise,参考我的文章: 实现一个完美符合Promise/A+规范的Promise 一般不会问的很详细,只要能写出上述文章中的v1.0版本

  • a、b默认都可选,但当a有值时,让b成为必填项。 应该如何实现?

  • 本文向大家介绍Javascript HTML5 Canvas实现的一个画板,包括了Javascript HTML5 Canvas实现的一个画板的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了HTML5 Canvas实现的一个画板代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。

  • https://shanghai.wellingtoncollege.cn/ 每次鼠标滚轮往下一格时, 页面就会往下滑动固定高度的一页, 这种效果是怎么实现的?