我正在寻找一种方法来获得以下函数签名:
type fn = <T>(fields : (keyof T)[]) => { [key in fields] : any }
哪会产生类型检查如下
const StructureType = {
a: 1,
b: 2,
}
// the fields argument is strictly type checked
// this fails because c not in keyof T
const x = fn<typeof StructureType>(['c'])
// this works
const x = fn<typeof StructureType>(['a'])
// x should be of type = { a : any }
// function parameter
如果链接泛型它可以工作,但是你必须手动传递多个泛型类型
type fn = <T, TField extends keyof T>(fields : TField[]) => { [key in TField] : any }
// cannot call like this, throws error missing arguments
const x = fn<StructureType>(['a'])
如果您将类型作为参数传递,则可以删除泛型defs,但随后将未使用的参数传递给函数:
type fn = <T, TField extends keyof T>(structType : T, fields : TField[]) => { [key in TField] : any }
// works
const x = fn(StructureType, ['a'])
我发现的另一种方法是将函数链接在一起:
type fn = <T>() => <TField extends keyof T>(fields : TField[]) => { [key in TField] : any }
// this works
const x = fn<StructureType>()(['a'])
但显然这不是最佳解决方案,因为它会产生不必要的额外功能。
有没有办法实现我想要的而不需要额外的,不需要的代码?