如何基于TypeOne的ReadonlyArray<Maybe<...>>属性创建数组元素对应类型
正确实现方式
你只需要两步操作:先提取数组的元素类型,再解除Maybe的包装即可,完整写法如下:
// 写法1(最简洁,适配绝大多数场景的Maybe定义) type TypeTwo = NonNullable<TypeOne['data'][number]>
原理解释
- 你之前使用
TypeOne['data']得到的是完整的ReadonlyArray<Maybe<目标类型>>类型,本身是数组类型,自然不符合你的需求。 - TS中所有数组/只读数组类型都可以通过
[number]索引访问,获取到数组内元素的类型,执行TypeOne['data'][number]后你会得到Maybe<目标类型>。 - 绝大多数场景下
Maybe<T>的定义是T | null | undefined,使用TS内置的NonNullable<T>工具类型即可排除掉null和undefined类型,拿到你需要的原始类型,和你手动写的TypeTwo完全等价。
如果你的Maybe有自定义的特殊实现,也可以用条件类型自行提取包裹的类型,示例如下:
// 适配自定义Maybe的通用写法 type UnwrapMaybe<T> = T extends Maybe<infer U> ? U : T type TypeTwo = UnwrapMaybe<TypeOne['data'][number]>
内容的提问来源于stack exchange,提问作者TP_Dev
相关产品推荐
相关产品推荐

