Typescript 如何从多个属性动态构造类型?

Typescript 如何从多个属性动态构造类型?,typescript,types,typescript-generics,Typescript,Types,Typescript Generics,我正在研究Typescript中的高级类型,到目前为止,我拥有的是一个类型x,它接受一个通用参数props extensed string。作为props的值给定为name | age | email这构造了以下类型: { name: "name", age: "age", email: "email" } 上述类型由以下类型定义生成: type x<Property extends string> = { [K in Property]: K } 我想做的是

我正在研究Typescript中的高级类型,到目前为止,我拥有的是一个
类型x
,它接受一个通用参数
props extensed string
。作为
props
的值给定为
name | age | email
这构造了以下类型:

{
  name: "name",
  age: "age",
  email: "email"    
}
上述类型由以下类型定义生成:

type x<Property extends string> = { [K in Property]: K }
我想做的是将多个属性传递给
x
,传递方式如下:
x(“姓名”、“年龄”、“电子邮件”)
生成类型
x

我知道我可以通过如下方式重构方法
x
来实现这一点:

let x = <props extends string>(...p: props[]): x<props> => null! // Don't know how to implement this
let x=(…p:props[]):x=>null!//我不知道如何实现这一点
但是我不知道如何从输入中构造一个具体的对象,类似于
({[p]:p})
,而是迭代传递给
x
的所有属性


那么,有没有一种方法可以迭代属性并动态构造类型呢

您只需迭代这些道具并将它们分配给一个新对象:

type x<Property extends string> = { [K in Property]: K }


let x = <props extends string>(...p: props[]): x<props> => {
    let result = {} as x<props>
    for (let k of p) {
        result[k] = k
    }
    return result;
} 

let a = x("name", "age") // Type is x<"name">
console.log(a);

然后我也可以使用props.foreach(prop=>…),这是一个软件工程课程的学校项目。老师们不喜欢使用循环、if、else、for、whiles等,所以有时候我不知道什么是允许的。但我会像循环一样ok@HarryStylesheet如果你想让他们惊叹,请使用reduce版本:我想他们会喜欢这样,整个课程都是关于函数合成、函子、幺半群和单子的。@HarryStylesheet-nah。。为此,您需要在TS中编写命令式代码,没有任何要点:P。
let x = <props extends string>(...p: props[]): x<props> => null! // Don't know how to implement this
type x<Property extends string> = { [K in Property]: K }


let x = <props extends string>(...p: props[]): x<props> => {
    let result = {} as x<props>
    for (let k of p) {
        result[k] = k
    }
    return result;
} 

let a = x("name", "age") // Type is x<"name">
console.log(a);
let x = <props extends string>(...p: props[]): x<props> => p.reduce((o, k) => (o[k] = k, o), {} as x<props>);