Typescript 具有函数正确返回类型的元组参数

Typescript 具有函数正确返回类型的元组参数,typescript,Typescript,如何将正确的类型关联函数参数作为元组返回?我希望函数根据参数的元组类型返回其值 type MapAllPaths<T, P extends Path<T>[]> = {} & { [K in keyof P ]: PathValue<T, P[K] & Path<T>> } declare function getAll<T, P extends [Path<T>] | Path<T>[]>

如何将正确的类型关联函数参数作为元组返回?我希望函数根据参数的元组类型返回其值

type MapAllPaths<T, P extends Path<T>[]> = {} & {
  [K in keyof P ]: PathValue<T, P[K] & Path<T>>
}

declare function getAll<T, P extends [Path<T>] | Path<T>[]>(obj: T, args: P): MapAllPaths<T, P>;

下面的示例是一个
get
函数,但我想让它以元组的形式使用
getAll
函数和参数

type PathImpl<T, Key extends keyof T> =
  Key extends string
  ? T[Key] extends Record<string, any>
    ? | `${Key}.${PathImpl<T[Key], Exclude<keyof T[Key], keyof any[]>> & string}`
      | `${Key}.${Exclude<keyof T[Key], keyof any[]> & string}`
    : never
  : never;

type PathImpl2<T> = PathImpl<T, keyof T> | keyof T;

type Path<T> = PathImpl2<T> extends string | keyof T ? PathImpl2<T> : keyof T;

type PathValue<T, P extends Path<T>> =
  P extends `${infer Key}.${infer Rest}`
  ? Key extends keyof T
    ? Rest extends Path<T[Key]>
      ? PathValue<T[Key], Rest>
      : never
    : never
  : P extends keyof T
    ? T[P]
    : never;

declare function get<T, P extends Path<T>>(obj: T, path: P): PathValue<T, P>;

const object = {
  firstName: "test",
  lastName: "test1"
} as const;

get(object, "firstName");

declare function getAll<T, P extends Path<T>>(obj: T, args: P[]): PathValue<T, P>;

const data = getAll(object, ['firstName', 'lastName'])
// how to produce the type: ['test', 'test1']
pathinpl类型=
键扩展字符串
? T[Key]扩展记录
? | `${Key}.${PathImpl&string}`
|`${Key}.${Exclude&string}`
:从不
:从不;
PathImpl2型=PathImpl | keyof T;
type Path=PathImpl2扩展字符串| keyof T?路径2:keyof T;
类型路径值=
P扩展了`${inferkey}.${inferrest}`
? 键扩展了keyt的键
? Rest扩展路径
? 路径值
:从不
:从不
:P扩展了T的键
? T[P]
:从不;
声明函数get(obj:T,path:P):PathValue;
常量对象={
名字:“测试”,
姓氏:“test1”
}作为常量;
获取(对象,“名字”);
声明函数getAll(obj:T,args:P[]):PathValue;
const data=getAll(对象,['firstName','lastName'])
//如何生成类型:['test','test1']

您可以使用映射类型映射传入的元组。您还必须更改type参数以捕获元组类型

type MapAllPaths<T, P extends Path<T>[]> = {} & {
  [K in keyof P ]: PathValue<T, P[K] & Path<T>>
}

declare function getAll<T, P extends [Path<T>] | Path<T>[]>(obj: T, args: P): MapAllPaths<T, P>;

键入mapallpath={}&{
[K in keyof P]:路径值
}
声明函数getAll(obj:T,args:P):mapallpath;