Javascript 如何使用TypeScript最好地描述此代码?
这是一个有几个不同键和值的对象,每个值的道具都不同,如何用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
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"? -> ~~~~~~~~