基于函数参数值的窄对象键

Narrow object keys based on function parameter value

最新版本的打字稿是否可以根据通过参数提供的缩小对象的属性,而不将它们指定为函数的单独通用类型?

我想要下面的工作,其中 bar returns 的函数签名是一个对象,其键作为参数提供。 理论上,如果参数是常数,应该可以推断出签名。

interface ModelType {
  id: string;
  name: string;
  timestamp: Date;
}


class Foo<T, K extends keyof T  = keyof T>{
  public bar(selectedField : K[]) : Pick<T,K>{
    return {} as any;
  }
}

const foobar = new Foo<ModelType>().bar(['id','name']);

console.log(foobar.id)          //Success
console.log(foobar.name)        //Success
console.log(foobar.timestamp)   //Should be an error

我尝试了与 typeof selectedValues unarray 的任何组合,但最终得到了完整的 K 集。

Class方法generic types

您可以将泛型类型添加到 class 方法到 extends class 的 generic type,如下所示:

class Foo<T, K extends keyof T = keyof T>{
  // using generic types in your class method
  public bar<L extends K>(selectedField : L[]) : Pick<T,L>{
    return {} as any;
  }
}

TypeScript Playground