Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用TypeScript最好地描述此代码?_Javascript_Reactjs_Typescript_Vue.js_Frontend - Fatal编程技术网

Javascript 如何使用TypeScript最好地描述此代码?

Javascript 如何使用TypeScript最好地描述此代码?,javascript,reactjs,typescript,vue.js,frontend,Javascript,Reactjs,Typescript,Vue.js,Frontend,这是一个有几个不同键和值的对象,每个值的道具都不同,如何用TypeScript最好地描述这个对象?特别是setValue方法,如何限制creatoreType、prop和value的类型 const object = { john: { name: '', age: 18 }, alien: { height: 20, power:100, }, setValue(cre

这是一个有几个不同键和值的对象,每个值的道具都不同,如何用TypeScript最好地描述这个对象?特别是
setValue
方法,如何限制
creatoreType
prop
value
的类型

 const object = {
      john: {
        name: '',
        age: 18
      },
      alien: {
        height: 20,
        power:100,
      },
      setValue(creatureType) {
        const self = this
        return function (prop) {
          return function (value) {
            self[creatureType][prop] = value
          }
        }
      }
    }
如果你想让你的
setValue()
方法对哪些属性和值与哪个,呃,“生物类型”相匹配设置严格的限制,那么你的
setValue()方法必须是。由于
对象
setValue()
方法的类型将取决于
对象
的其他属性的类型,编译器将放弃为其推断类型的尝试;对于非
类的东西来说,它太循环了。您可以手动注释所有类型,这会很烦人,或者您可以将
对象
分为两部分,比如只保存数据的
纯对象
,然后合并到
setValue()
方法中,该方法将取决于
纯对象
的类型,如下所示:

const plainObject = {
    john: { name: '', age: 18 },
    alien: { height: 20, power: 100 }
}
type PlainObject = typeof plainObject;

const object = {
    ...plainObject,
    setValue<K extends keyof PlainObject>(creatureType: K) {
        const self: PlainObject = this;
        return function <P extends keyof PlainObject[K]>(prop: P) {
            return function (value: PlainObject[K][P]) {
                self[creatureType][prop] = value;
            }
        }
    }
}
好吧,希望这会有帮助;祝你好运


该方法类似于
(prop:string)=>(value:any)=>void
,但老实说,我会使用真正的setter。如果希望在不传递引用的情况下公开它们,但不让方法返回闭包,请将它们包装在lambda中。你把政策和执行纠缠在一起了。对不起,我的英语不是很好,你是说关闭不是一个好的做法吗?你能举个例子吗?非常感谢
类Foo{bar:string};const foo=新foo();导出常量setter=(prop:string)=>(val:any)=>foo[prop]=val实例是模块的本地实例,这样就不会使类实现与访问策略混乱。不过,您可能希望使用泛型而不是
any
,请参见jcalz的答案。
object.setValue("john")("age")(19); // okay
object.setValue("alien")("height")("pretty tall"); // error!
// "pretty tall" isn't numeric --> ~~~~~~~~~~~~~
object.setValue("john")("power")(9000); // error!
// "power" is wrong --> ~~~~~~~
object.setValue("elaine")("name")("elaine"); // error!
// "elaine"? -> ~~~~~~~~