Typescript|Typescript额外的属性检查 和 对象拥有任意个属性

interface Person{ name:string; age?:number; } printName(params:Person){ console.log(params.name); }//调用方式1,该调用方式会报错,因为直接把对象赋值给函数参数,函数会按照函数参数类型 //Person对参数进行检查,aeg并不在接口中 printName({name:"测试",aeg:20}); //调用方式2,该调用方式会报错,但是会直接在let params2:Person = {name:"测试",aeg:20}; 报错, //因为我们声明了params1为一个Person类型的对象,所以在赋值是就会进行检查 let params1:Person = {name:"测试",aeg:20}; printName(params1); //调用方式3,该调用方式不会报错,我们直接将 {name:"测试",aeg:20}赋值给params2; 但是params没有声明接口的类型,所以这里不会进行类型检查,再将params2当参数传给函数,此时函数也不会对一个变量进行类型的检查,所以也不会报错 let params2 = {name:"测试",aeg:20}; printName(params2);

【Typescript|Typescript额外的属性检查 和 对象拥有任意个属性】以上的3中调用方式中虽然第3种会绕过typescript的检查,让其不会报错,但是在实际的使用中却不应该这样使用,毕竟大部分的场合这种报错都是bug
除开使用上面第3种的方法让我们传入的对象能拥任意个数量外还可以使用类型断言或者字符串索引签名来实现此功能
使用类型断言调用 printName({name:"测试",aeg:20} as Person); 或者如下使用字符串索引签名申明 interface Person{ name:string; age?:number; [propertys:string]:any; }

    推荐阅读