我具有以下功能:
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]
。
答案 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]>;