TypeScript:应用于所有对象的Factor out函数';s属性

TypeScript:应用于所有对象的Factor out函数';s属性,typescript,Typescript,假设我们有一些泛型函数 function change<T>(something: T): IWhatever<T> {} 我能做一个更简单的物体吗 const stuff = { key1: change(1), key2: change('hello'), key3: change(false) } const stuff = { key1: 1, key2: 'hello', key3: false } 并通过适

假设我们有一些泛型函数

function change<T>(something: T): IWhatever<T> {}
我能做一个更简单的物体吗

const stuff = {
    key1: change(1),
    key2: change('hello'),
    key3: change(false)
}
const stuff = {
    key1: 1,
    key2: 'hello',
    key3: false
}
并通过适当的TypeScript输入,将简单的对象传递到某个函数中,该函数将吐出第一个对象?还假设简单的对象可以随时更改属性,“某些函数”仍然会生成适当的复杂函数


我想不出来,也不知道这是否可能。

好吧,您可以通过使用
映射类型来实现这一点。您只需使用2种类型映射:

  • 剥离
    IWhatever
  • 对每个属性应用剥离操作
  • //一个奇怪的接口
    接口IWhatever{
    whut:T;
    }
    //一个奇怪的函数,它将所有东西都封装到这个奇怪的接口中
    函数更改(something:T):IWhatever{return{whut:something};}
    //定义所有属性的常规类型必须是IWhatever类型
    类型Whatevered={
    [key in keyof R]:我曾经
    }
    //这个对象适合我们上面定义的类型
    常数stuff={
    关键1:更改(1),
    键2:更改(“你好”),
    键3:更改(错误)
    }
    //这张地图显示了IWhatever类型
    类型UnWhateverify=T扩展IWhatever?R:T;
    //这会将strping应用于对象的所有属性
    类型清理器={[Key in keyof T]:UnWhateverify}
    //此函数是一个演示类型操作的伪(魔术)函数
    功能MagicJhonson(项目:T):清洁剂{
    让cleansed={}如任何;
    //在这里打扫卫生
    用于(让输入项)
    cleaned[key]=item[key].whut;//常规类型定义'Whatevered'使其有效
    //你也可以跳过它,在这里对任何动作进行一些强制转换。
    以清洁剂的形式返回;
    }
    const cleansedStuff=magicjonson(stuff);
    console.log(cleansedStuff.key1)//编号
    console.log(cleansedStuff.key2)//字符串
    console.log(cleansedStuff.key3)//布尔值
    //另一个用于反向应用操作的虚拟函数
    功能JhonsonMagic(项目:T):涉及什么{
    设whuts={}为任意值;
    用于(让输入项){
    whuts[关键]=变更(项目[关键])
    }
    返回whuts作为Whatevered;
    }
    const-oldStuff=JhonsonMagic(cleansedStuff);
    console.log(oldStuff.key1)//whut:number
    console.log(oldStuff.key2)//whut:string
    console.log(oldStuff.key3)//whut:boolean
    

    也许这会有帮助?不够具体。你的变化函数是可逆的吗?(你能从我曾经通过改变回到改变的论点上来吗?)有了这一点,我也能走相反的方向吗?从清理过的对象开始,以IWhatever'd对象结束?@ZeroSevenTen您只需要一个返回
    所有内容的函数。请参阅更新的答案。