typescript - 将接口(interface)转换为 typescript 中的元组

标签 typescript

我想将一个接口(interface)转换成键和值的元组。我想知道使用泛型是否可以做到这一点,但对语言功能的了解还不够多,无法做到这一点。

这是我想做的事情:

interface Person {
    name: string,
    age: number
}

type Args = ToTuple<Person> // result would be ['name', string, 'age', number]

function DoSomethingWithArgs(...args: Args) {
    return (
        args[0] === 'name' &&
        typeof args[1] === 'string' &&
        args[2] === 'name' &&
        typeof args[3] === 'number'
    )
}

这可能吗?

最佳答案

我不确定你为什么想要这个,但这里是......

使用来自 this answer 的想法要将映射类型转换为我们可以与不同类型参数匹配的函数的交集,我们可以定义 ToTuple 以适用于原始接口(interface)的固定最大成员数的方式。

type IntersectionOfValues<T> =
  {[K in keyof T]: (p: T[K]) => void} extends
    {[n: string]: (p: infer I) => void} ? I : never;

type IntersectionOfFunctionsToType<F, T> =
    F extends {
        (na: infer NA, a: infer A): void;
        (nb: infer NB, b: infer B): void;
        (nc: infer NC, c: infer C): void;
    } ? [NA, A, NB, B, NC, C] :
    F extends {
        (na: infer NA, a: infer A): void;
        (nb: infer NB, b: infer B): void;
    } ? [NA, A, NB, B] :
    F extends {
        (na: infer NA, a: infer A): void
    } ? [NA, A] :
    never;

type ToTuple<T> = IntersectionOfFunctionsToType<
    IntersectionOfValues<{ [K in keyof T]: (k: K, v: T[K]) => void }>, T>;

interface Person {
    name: string,
    age: number
}

type Args = ToTuple<Person> // ['name', string, 'age', number]

另一种方法是使用 UnionToIntersectionkeyof 接口(interface)上,但我相信通过联合可能会带来丢失接口(interface)成员顺序的更大风险。 (我相信我过去曾看到工会失去秩序,尽管我刚才无法在 Playground 上的测试中重现它。)在上面的解决方案中,交叉点是有序的,所以我们只依赖映射类型以保持顺序,IntersectionOfValues 中的推理过程按顺序生成逆变候选对象并按顺序与它们相交。这仍然是依赖于实现的行为,但我认为它不太可能改变。

关于typescript - 将接口(interface)转换为 typescript 中的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53058150/

相关文章:

angular - 尽管请求处理成功,但从发布请求中获得空响应

javascript - 当我省略/需要 Prop 时,为什么受歧视的工会不起作用?

javascript - 将 js 数组转换为字典/ HashMap

typescript - TypeScript 中的简单扩展方法

angular - ngx-translate 与 ts 文件上的动态文本

javascript - Angular:一种识别服务调用者的方法

typescript - typescript 中 gcloud param DefineSecret 的类型 'value' 不存在属性 'SecretParam'

javascript - AWS API 网关的 HTTP 客户端请求

javascript - 阶段未在 TypeScript 中使用 window.onresize 进行更新 (0.9.1.1)

javascript - 使用 javascript 在 p(react) 项目中实现 Google Adsense