TypeScript-推断或声明拾取类型为函数返回值

TypeScript-推断或声明拾取类型为函数返回值,typescript,Typescript,考虑以下简化函数,该函数接受对象和该对象的属性,并返回仅具有指定属性的该对象的克隆: export function clonePick<T, K extends keyof T>(obj: T, prop: K) { const keys = Object.keys(obj).filter(k => k === prop) return keys.reduce( (clone: any, key: string) => { return {

考虑以下简化函数,该函数接受对象和该对象的属性,并返回仅具有指定属性的该对象的克隆:

export function clonePick<T, K extends keyof T>(obj: T, prop: K) {
  const keys = Object.keys(obj).filter(k => k === prop)
  return keys.reduce(
    (clone: any, key: string) => {
      return { ...clone, [key]: obj[key as keyof T] };
    },
    {}
  );
}
导出函数clonePick(对象:T,属性:K){
常量keys=Object.keys(obj.filter)(k=>k==prop)
返回键。减少(
(克隆:任意,键:字符串)=>{
返回{…clone[key]:obj[key as keyof T]};
},
{}
);
}
除了值而不是类型之外,这与Pick的行为基本相同,因此它的返回类型可以表示为:

Pick<T, prop>
拾取
除上述内容外,typescript无效。但是,调用函数时,我们可以在运行前很好地了解prop的值:

interface ITest {
  numProp: number;
  strProp: string;
}

const test = { numProp: 1, strProp: '1' }; // <-- type is ITest

const testClone = clonePick(test, 'numProp') // <-- type is any
接口测试{
numProp:数字;
strProp:字符串;
}

常量测试={numProp:1,strProp:'1'};// 您不会让编译器推断出复杂的
reduce
调用
Pick
,它甚至不会将其用于更简单的事情,例如
{[prop]:obj[prop]}
。最好的选择是对函数的返回类型使用注释

export function clonePick<T, K extends keyof T>(obj: T, prop: K): Pick<T,K> {

  return { [prop]: obj[prop] } as any;
}


interface ITest {
  numProp: number;
  strProp: string;
}

const test = { numProp: 1, strProp: '1' }; // <-- type is ITest

const testClone = clonePick(test, 'numProp') // 

testClone.numProp
testClone.strProp // err
导出函数clonePick(对象:T,属性:K):拾取{ 返回{[prop]:obj[prop]}如有; } 接口测试{ numProp:数字; strProp:字符串; }
常量测试={numProp:1,strProp:'1'};//我假设签名不能与一系列道具一起使用,但TypeScript巧妙地推断这是
“numProp”|“strProp”
。这正是我需要的行为!
export function clonePick<T, K extends keyof T>(obj: T, prop: K): Pick<T,K> {

  return { [prop]: obj[prop] } as any;
}


interface ITest {
  numProp: number;
  strProp: string;
}

const test = { numProp: 1, strProp: '1' }; // <-- type is ITest

const testClone = clonePick(test, 'numProp') // 

testClone.numProp
testClone.strProp // err