使用数组进行类型解析

时间:2017-06-09 02:21:16

标签: typescript

我正在寻找一种方法来获得以下函数签名:

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'])

但显然这不是最佳解决方案,因为它会产生不必要的额外功能。

有没有办法实现我想要的而不需要额外的,不需要的代码?

0 个答案:

没有答案