Typescript:检查对象键和值是否适合当前的类属性

时间:2017-05-18 10:55:16

标签: typescript types

我需要检查对象键和值是否适合当前的类属性 我有类实例和单独对象中的更改然后我调用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 }但没有成功。

注意:我无法更改类本身(例如,使类属性可选)。

3 个答案:

答案 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。我只测试并使用了简单类型,如字符串,数字等。