1. 如何在TypeScript中根据对象的结构动态决定属性的必填性?
type A = {
b: {
c?: string;
};
a: {
c: string;
};
};
interface AddDisplayItem<T extends keyof A> {
data: A[T];
}
我希望data
是否必传由A[T]
是否有必传属性决定。如何做呢?
回复
1个回答
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
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容