我需要检查对象键和值是否适合当前的类属性 我有类实例和单独对象中的更改然后我调用Object.assign来修改属性。有没有办法检查对象键和值是否对某个类有效?
class MyClass {
icon = 'home'
size = 12
color = 'blue'
}
var instance = new MyClass()
var changeProperties: MyClass = { size: 10 }
// throws Property 'icon' is missing in type { size: number; }
Object.assign(instance, changeProperties)
现在有未定义属性的错误(缺少属性图标)。
我尝试var changeProperties: { [string: keyof MyClass]: any } = { size: true }
但没有成功。
注意:我无法更改类本身(例如,使类属性可选)。
答案 0 :(得分:4)
我在lib.es6.d.ts找到了答案
/**
* Make all properties in T optional
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
所以答案是:
class MyClass {
icon = 'home'
size = 12
color = 'blue'
}
var instance = new MyClass()
var changeProperties: Partial<MyClass> = { size: 10 }
Object.assign(instance, changeProperties)
答案 1 :(得分:2)
我们总能告诉TS我们了解更多,即
// instead of this
var changeProperties: MyClass = { size: 10 }
// we can assure TS that we know more than it..
var changeProperties: MyClass = { size: 10 } as MyClass
这是断言 - 一个TS的陈述 - 指示传递的对象真的应该是什么
答案 2 :(得分:0)
不确定我是否理解正确,但也许是这样的
class MyClass {
icon = 'home'
size = 12
color = 'blue'
}
//just copied from your code, I don't know the purpose of it
var instance = new MyClass()
var changeProperties: MyClass = new MyClass();
var properties = { size: 10, hello: 'test'};
for(const property of Object.getOwnPropertyNames(properties)) {
if(instance.hasOwnProperty(property) && typeof instance[property] === typeof properties[property]) {
instance[property] = properties[property];
}
}
也许有更好的解决方案,但这就是我解决类似问题的方法。
如果您在循环后查看instance
,您会看到hello
已被忽略且未分配。
如果您将size
中的properties
更改为字符串,也会发生同样的情况。
instance.size
然后仍然是12。
参见资源:
它只适用于IE9 +
P.S。我只测试并使用了简单类型,如字符串,数字等。