将对象类型转换为类型数组

时间:2020-03-16 07:13:27

标签: typescript typescript-typings

需要根据对象类型生成类型数组:

type T = {
    a: number | string;
    b: string | number;
    c: number;
    d: boolean;
};

期望:

[number | string, string | number, number, boolean]

想用作描述函数中扩展参数的类型:

function fun(...args: values of T) {
    const [a, b, c, d] = args;
}

fun("a", "b", 8, true);

3 个答案:

答案 0 :(得分:1)

我不认为可以,因为args的数组是不确定的顺序。如果您尝试将args散布到一个数组中并尝试将其键入为Array<T[keyof T]>,则会导致TypeScript将所有类型混合在一起,因为它不能确定性地缩小单个数组项的类型。 See it on the playground

function fun(...args: Array<T[keyof T]>) {
    const [a, b, c, d] = args;
}

Blending of types

如果您查看推断的类型,则此要素的取值范围为args的类型为<number | string | boolean>[]

唯一的出路是通过将所有4个参数作为单个对象传递来告知TypeScript固定数量的参数。 See it on the playground

function fun({ ...args }: T) {
    const { a, b, c, d } = args;
}

fun({
   a: 'a',
   b: 'b',
   c: 8,
   d: true 
});

解构args对象后,您将收到正确的输入:

Deconstructed typings

答案 1 :(得分:0)

不能保证javascript中的对象属性是有序的,因此打字稿无法知道命名属性如何映射到有序值。

您希望该示例如何工作?参数顺序是什么?还不清楚。

interface HasID {
  id: number
}

interface Message extends HasID {
  message: string
}

我认为最好的方法是动态性较低的方法,例如为每个参数明确地提取属性:

type T = {
    a: number | string;
    b: string | number;
    c: number;
    d: boolean;
};

function fun(a: T['a'], b: T['b'], c: T['c'], d: T['d']) {
    var obj: T = { a, b, c, d }
}

fun("a", "b", 8, true);

答案 2 :(得分:-1)

您可以尝试使用Object.values(objectName)将对象转换为数组。