ts属性二选一

interface Eg1 {
name: string,
age: number,
}
让name和age只能传其一, 并且必传, 该怎么改呢 ?
image.png
image.png

type oneOf<T,U> =
  | {
    T: string;
    U?: never;
    }
  | {
    U: string;
      T?: never;
    };
type start = oneOf<'startTime', 'startDate'>
let obj: start = {
  startTime: '1'
}
阅读 4k
2 个回答
type Eg1 =
  | {
      name: string;
      age?: never;
    }
  | {
      age: number;
      name?: never;
    };

function fn(data: Eg1) {}

fn({ name: 'cc' });                 // OK
fn({ age: 100 });                   // OK
fn({});                             // Error
fn({ name: 'cc', age: 100 });       // Error
fn({ name: 'cc', other: 'other' }); // Error

应题主要求补充回答:

type Eg1<T extends string, P extends string> =
  | ({
      [K in T]: string;
    } & {
      [K in P]?: never;
    })
  | ({
      [K in P]: number;
    } & {
      [K in T]?: never;
    });
interface Eg1 {
  name: string;
  age: number;
}

type RequiredOneOf<T, K extends keyof T> = { [P in K]: Omit<T, P> & { [S in P]?: undefined } }[K] extends infer O
  ? { [K in keyof O]: O[K] }
  : never;

type NameOrAge = RequiredOneOf<Eg1, "name" | "age">;
type Start = RequiredOneOf<
  {
    startDate: string;
    startTime: string;
  },
  "startDate" | "startTime"
>;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题