Typescript推断返回的数组类型元素

时间:2019-07-09 07:41:19

标签: typescript

我具有以下功能:

const data = {
  id: 1,
  name: '',
}

type keysType = keyof(typeof data);

function getKeysValues(...keys: keysType[]) {
  return keys.map(k => data[k]);
}

const value = getKeysValues('id', 'name');

value的类型为(string | number)[]。如何根据传递的密钥将其更改为动态?因此,在上述情况下,我希望类型为[number, string]

2 个答案:

答案 0 :(得分:1)

在元组TypeScript 3.1上使用映射类型

const data = {
  id: 1,
  name: '',
}

type Data = typeof data;
type DataKeysType = keyof(typeof data);
type DataFieldType<T> = T extends DataKeysType ?  Data[T] : never;

type MappedDataTuple<T extends DataKeysType[]> = {
    [K in keyof T]: DataFieldType<T[K]>;
}

function getKeysValues<T extends DataKeysType[]>(...keys: T): MappedDataTuple<T> {
  return <any>keys.map(k => data[k]);
}

// const value: [number, string]
const value = getKeysValues('id', 'name');

答案 1 :(得分:1)

最简单的方法:

function getKeysValues(...keys: Array<keyof typeof data>): Array<typeof data[keyof typeof data]> {
    return keys.map(k => data[k]);
}

您还可以添加泛型:

function getKeysValues<K extends keyof typeof data>(...keys: Array<K>): Array<typeof data[K]> {
    return keys.map(k => data[k]);
}

但是为方便起见,在上述任何情况下,我都将typeof data进行类型别名

type Data = typeof data;
// then
function getKeysValues(...keys: Array<keyof Data>): Array<Data[keyof Data]>;
// or
function getKeysValues<K extends keyof Data>(...keys: Array<K>): Array<Data[K]>;