我有一个类型,我希望能够为其定义恰好一个属性.

例如,如果我有

type MyType = {
  a: number;
  b: number;
  c: number;
};

我预计会有OneUndefined<MyType>

成为

  | {
      a?: undefined;
      b: number;
      c: number;
    }
  | {
      a: number;
      b?: undefined;
      c: number;
    }
  | {
      a: number;
      b: number;
      c?: undefined;
    };

还会对倒数、OneDefined<T>NDefined<T, n>感兴趣,其中恰好定义了n个属性.

我试着根据与一定数量的属性有关的类似问题来形成一种类型:

https://stackoverflow.com/a/49725198

https://stackoverflow.com/a/62163715/10252820

然而,一直无法使这些符合这里提出的问题.

推荐答案

好的,我设法给出了OneUndefined<T>的答案:

type OneUndefined<T> = {
  [K in keyof T]: {
    [P in K]?: undefined;
  } & Omit<T, K>;
}[keyof T];

type MyType = {
  a: number;
  b: number;
  c: number;
};

// valid
const valid1: OneUndefined<MyType> = {
  a: 1,
  b: undefined,
  c: 3,
};

// valid
const valid2: OneUndefined<MyType> = {
  a: 1,
  b: 2,
};

// rejected
const invalid1: OneUndefined<MyType> = {
  a: 1,
  b: 2,
  c: 3,
};

// rejected
const invalid2: OneUndefined<MyType> = {
  a: 1,
  b: undefined,
  c: undefined,
};

MyType美元

本节内容:

  [K in keyof T]: {
    [P in K]?: undefined;
  } & Omit<T, K>;

生成以下内容:

{
  a: {
    a?: undefined;
    b: number;
    c: number;
  };
  b: {
    a: number;
    b?: undefined;
    c: number;
  };
  c: {
    a: number;
    b: number;
    c?: undefined;
  };
};

然后这}[keyof T];从我们刚刚生成的类型中 Select 一个props .

编辑: OneDefined<T>类似于:

type OneDefined<T> = {
  [K in keyof T]: {
    [P in K]: T[P];
  } & { [P in keyof Omit<T, K>]?: undefined };
}[keyof T];

Typescript相关问答推荐

实现忽略了JSSOM中的doctor.body.innerHTML集

无需刷新即可让现场访客逆变

net::BER_RECTION_REUSED和Uncatch使用Axios和TanStack-Query useMutation时未捕获错误(DelivercMutation)

有没有办法解决这个问题,类型和IntrinsicAttributes类型没有相同的属性?

如何表示多层深度的泛型类型数组?

我可以为情态车使用棱角形的路由守卫吗?

匿名静态类推断组成不正确推断

如何在TypeScrip中正确键入元素和事件目标?

在类型脚本中的泛型类上扩展的可选参数

如何判断对象是否有重叠的叶子并产生有用的错误消息

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

使用数组作为类型中允许的键的列表

有没有一种方法可以确保类型的成员实际存在于TypeScript中的对象中?

TypeScrip错误:为循环中的对象属性赋值

对有效枚举值的常量字符串进行常规判断

如何使用泛型函数参数定义类型脚本函数

为什么在泛型方法中解析此promise 时会出现类型错误?

打字:注解`是字符串`而不是`布尔`?

什么';是并类型A|B的点,其中B是A的子类?

对于通过 Axios 获取的数据数组,属性map在类型never上不存在