gpt4 book ai didi

Parameters<> 中的 Typescript 接口(interface)类型

转载 作者:行者123 更新时间:2023-12-05 04:43:41 27 4
gpt4 key购买 nike

在为第三方库添加抽象层时,我想传递一个包含一些信息的对象+库的函数参数,但无法得到正确的转换。

// Types from Lib
type LibData = any | any[]
type LibOpts = { [key: string]: any }
type ExternalLibFunction = (data: LibData, opts?: LibOpts) => any

// Parameters<ExternalLibraryFunction> = [data: LibData, opts?: LibOpts]
type LibFunctionParameters = Parameters<ExternalLibFunction>

// How to convert LibFunctionParameters to...?
type LibParametersKeyed = {
data: LibData
opts?: LibOpts
}

// Use Example
type RunSet = { foo: any } & LibParametersKeyed

图书馆是xlsx on npm如果有帮助

最佳答案

Tuple element labels纯粹用于文档目的。与函数参数名称一样,它们对类型兼容性没有影响,并且在类型系统中是完全不可观察的。它们无法提取到字符串 literal types .参见 microsoft/TypeScript#31627对于将函数参数名称提取为字符串文字的拒绝请求。

例如,下面的类型是完全等价的:

// tuple labels are unobservable in the type system
declare var x: [data: LibData, opts?: LibOpts];
declare var x: [foo: LibData, bar?: LibOpts];
declare var x: [LibData, LibOpts?];

所以没有办法得到"data""opts"来自 ExternalLibFunctionLibFunctionParameters类型。

如果你想能够转LibFunctionParameters进入{data: LibData, opts?: LibObpts} ,您需要自己提供键名的有序列表。这意味着转换看起来像 TupleToObject<LibFunctionParameters, ["data", "opts"]>对于一些适当定义的 TupleToObject类型函数。

让我们定义它。


给定一个通用元组类型 T和另一个元组 K相同长度的元素是键名,你可以转换元组T到具有 K 中键的对象其值是T中的对应值像这样:

type TupleToObject<T extends any[], K extends { [I in keyof T]: PropertyKey }> = {
[I in keyof T as I extends keyof any[] ? never : K[I]]: T[I]
}

TupleToObject<T>使用 key remapping转动每个索引 ITK 中将元组转换为键(K[I]I 元组的 K th 元素)。注意 I in keyof T as遍历 T 中的所有键,包括数组属性和方法键,如 "push""length"number (有关更改此设置的请求,请参阅 microsoft/TypeScript#40586);我们不想处理这些,所以我们通过编写 I extends keyof any[] ? never : 来过滤掉它们压制他们。

让我们验证它是否适用于您的示例:

type LibParametersKeyed = TupleToObject<LibFunctionParameters, ["data", "opts"]>

/* type LibParametersKeyed = {
data: LibData;
opts?: LibOpts | undefined;
} */

看起来不错!

Playground link to code

关于Parameters<> 中的 Typescript 接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69558588/

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