type Foo = {
[key: string]: number; // 避免属性值为字符串
}
function validateObject(properties: Foo) {
for (const key in properties) {
if (Object.prototype.hasOwnProperty.call(properties, key)) { // 只验证对象自身的属性
const value = properties[key];
// ...
}
}
}
const obj = {
prop1: 1,
prop2: "2" // 报错:类型“string”不能赋给类型“number”。
};
validateObject(obj); // 报错:类型“{ prop1: number; prop2: string; }”的参数不能赋给类型“Foo”的参数
解释:
在代码中,我们定义了一个泛型类型Foo
,它的属性名是字符串类型,属性值是数字类型。这样可以确保在遍历对象属性时不遇到任何字符串。
然后我们定义了一个validateObject
函数,它接受一个类型为Foo
的对象作为参数。在遍历对象属性时,我们使用Object.prototype.hasOwnProperty.call()
来验证属性是否为对象自身的属性。这样可以保证只验证对象自身的属性而不是继承自原型链的属性。
最后,我们定义了一个obj
对象,它有两个属性,其中一个是字符串类型,这会在编译时报错。调用validateObject
函数时,因为obj
对象中包含非Foo
类型的属性,编译器也会报错。