需要根据对象类型生成类型数组:
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);
答案 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;
}
如果您查看推断的类型,则此要素的取值范围为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
对象后,您将收到正确的输入:
答案 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)
将对象转换为数组。