Nic*_*wer 8 typescript mapped-types
我正在尝试创建一个映射类型,它采用某种类型(在我的例子中是数组)的所有属性,并使它们成为可选的。但任何其他属性(非数组)都保持不变。我知道在定义映射类型时可以使用可选修饰符,如下所示:
type MyPartial<T> = {
[key in keyof T]?: T[key]
}
Run Code Online (Sandbox Code Playgroud)
但我不确定语法是否允许将其与条件结合起来。我可以非常接近以下内容:
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>;
Run Code Online (Sandbox Code Playgroud)
问题是,这会导致显式undefined的,而不是隐式的,所以虽然它在这两种情况下会按照我想要的方式运行:
const value1: Example2 = {
foo: [],
bar: 3,
}
const value2: Example2 = {
foo: undefined,
bar: 3,
}
Run Code Online (Sandbox Code Playgroud)
它会给出一个不需要的错误,而foo这个错误是缺少的:
const value3: Example2 = {
bar: 3,
}
Run Code Online (Sandbox Code Playgroud)
是否可以?在映射类型中添加可选修饰符 ( ),但仅当满足特定条件时才添加?
Ale*_*yne 13
可能有一种更优雅的方法,但是将两个映射类型相交并不太尴尬。一种用于可选属性,另一种用于必需属性。
例如:
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]
}
Run Code Online (Sandbox Code Playgroud)
请注意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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2821 次 |
| 最近记录: |