gpt4 book ai didi

typescript - 标记元组的类型级操作

转载 作者:行者123 更新时间:2023-12-04 17:24:29 27 4
gpt4 key购买 nike

我想用标记的元组做类似于下面的事情,并想知道它在 TS4 中是否可行

type stringProperties<T extends {}> = {[k in keyof T]: string}
这意味着我可以创建一个类型 [foo: string, bar: string, baz:string]来自 [foo: boolean, bar: number, baz: any]目前我缺少一般捕获标签的方法(它不存在于 keyof 中)并且不确定如何将另一个标签:类型对添加到现有的元组类型。
我知道下面的技术可以添加到未标记的元组,但在这种情况下,标签将设置为 first .
export type Prepend<E, T extends any[]> =
((first: E, ...args: T) => any) extends ((...args: infer U) => any)
? U
: never

最佳答案

您可以使用 mapped tuple types只是改变元素类型。他们的 labels被保留:

type T1 = stringProperties<[foo: boolean, bar: number, baz: any]> 
// [foo: string, bar: string, baz: string]
而你 cannot directly extract函数参数名称,仍然可以使用 TS 4.0 variadic tuple types 添加新的标记元素:
type Prepend<E extends [unknown], A extends any[]> = [...E, ...A]
type Append<E extends [unknown], A extends any[]> = [...A, ...E]
// ... extend to your needs

type T2 = Prepend<[customLabel: string], A>
// [customLabel: string, foo: boolean, bar: number, baz: any]
type T3 = Append<[customLabel: string], A>
// [foo: boolean, bar: number, baz: any, customLabel: string]
type T4 = Prepend<[customLabel: string], stringProperties<A>> // or mix it up
// [customLabel: string, foo: string, bar: string, baz: string]
...然后使用类型作为函数参数:
function foo(...args: T4) {}
// function foo(customLabel: string, foo: string, bar: string, baz: string): void
Playground

关于typescript - 标记元组的类型级操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64189351/

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