1. 如何在TypeScript中根据对象的结构动态决定属性的必填性?

作者站长头像
站长
· 阅读数 5
type A = {
  b: {
    c?: string;
  };
  a: {
    c: string;
  };
};
interface AddDisplayItem<T extends keyof A> {
  data: A[T];
}

我希望data是否必传由A[T]是否有必传属性决定。如何做呢?

回复
1个回答
avatar
test
2024-06-24
type A = {
  b: {
    c?: string;
  };
  a: {
    c: string;
  };
};

type AllOptional<T> = {
  [K in keyof T]-?: {} extends Pick<T, K> ? never : K
}[keyof T] extends never ? true : false;

type AddDisplayItem<T extends keyof A> = AllOptional<A[T]> extends true
  ? { data?: A[T] }
  : { data: A[T] };

const item1: AddDisplayItem<'a'> = { data: { c: 'Hello' } }; // 'data' is required
const item2: AddDisplayItem<'b'> = {}; // 'data' is optional
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容