typescript - 映射类型可以使属性成为可选的,但前提是满足条件?
问题描述
我正在尝试创建一个映射类型,它采用某种类型的所有属性并使它们成为可选的,但保持所有其他属性不变。我知道在定义映射类型时可以使用可选修饰符,如下所示:
type MyPartial<T> = {
[key in keyof T]?: T[key]
}
但我不确定语法是否允许将其与条件结合使用。我可以非常接近以下内容:
type OptionalArrays<T> = {
[key in keyof T]: T[key] extends Array<any> ? T[key] | undefined : T[key]
}
interface Example {
foo: string[];
bar: number;
};
type Example2 = OptionalArrays<Example>;
问题是这会导致显式undefined
s,而不是隐式 s,所以虽然它会在这两种情况下表现得如我所愿:
const value1: Example2 = {
foo: [],
bar: 3,
}
const value2: Example2 = {
foo: undefined,
bar: 3,
}
它会给出一个不需要的错误,foo
这个错误:
const value3: Example2 = {
bar: 3,
}
是否可以在映射类型中添加可选修饰符 ( ?
),但前提是满足特定条件?
解决方案
可能有一种更优雅的方式,但是将两个映射类型相交并不太尴尬。一个用于可选属性,一个用于必需属性。
例如:
type OptionalArrays<T> = {
[key in keyof T as T[key] extends Array<any> ? key : never]?: T[key]
} & {
[key in keyof T as T[key] extends Array<any> ? never : key]: T[key]
}
注意as
映射类型的关键部分。这让您可以转换密钥类型。在这种情况下,如果我们想保留它,我们要么使用实际的密钥,否则就将其转换为never
。
或者也许这个版本是相似的,但可以说是稍微不那么神秘。
type ArrayKeys<T> = {
[key in keyof T]: T[key] extends Array<any> ? key : never
}[keyof T]
type OptionalArrays<T> =
Omit<T, ArrayKeys<T>> & // get one type without array keys
Partial<Pick<T, ArrayKeys<T>>> // get one type with array keys as optional
推荐阅读
- deep-learning - 优化器的 state_dict 中保存了什么?"state","param_groups" 代表什么?
- python - 将图表添加到 matplotlib 子网格
- mongodb - MongoDB 不启动,退出代码 203
- discord.js - Discord JS - 嵌入页脚文本
- anylogic - 自定义资源选择以使用特定叉车运输托盘
- primefaces - 隐藏使用 PrimeFaces 动态创建的显示组件
- vuejs2 - 无法从使用 npm 安装的包中访问功能
- java - Android GPU渲染速度慢的问题
- survey - 使用 Svyciprop 获得两个变量的 CI 流行率
- javascript - 如何将第一个 API 调用的返回值用作第二个 API 调用的参数?