gpt4 book ai didi

typescript - 映射类型可以使属性成为可选的,但前提是满足条件?

转载 作者:行者123 更新时间:2023-12-05 01:06:48 24 4
gpt4 key购买 nike

我正在尝试创建一个映射类型,它采用某种类型的所有属性并使它们成为可选的,但保持所有其他属性不变。我知道在定义映射类型时可以使用可选修饰符,如:

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>;

问题是这会导致显式的 undefineds,而不是隐式的,所以虽然它会在这两种情况下按照我的意愿行事:

const value1: Example2 = {
foo: [],
bar: 3,
}

const value2: Example2 = {
foo: undefined,
bar: 3,
}

它会给出一个不需要的错误,即 foo 缺少这个:

const value3: Example2 = {
bar: 3,
}

是否可以在映射类型中添加可选修饰符(?),但仅在满足特定条件时?

Playground link

最佳答案

可能有一种更优雅的方式,但是将两个映射类型相交并不太尴尬。一个用于可选属性,一个用于必需属性。

例如:

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。这让您可以转换 key 类型。在这种情况下,如果我们想保留它,我们要么使用实际的 key ,要么如果我们不保留它,则将其转换为 never

Playground


或者也许这个版本是一个类似的版本,但可以说稍微不那么神秘。

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

Playground

关于typescript - 映射类型可以使属性成为可选的,但前提是满足条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68492248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com