我按如下方式声明一个对象:
const x: { str: string, num: number } = {
str: str,
num: not_a_num
};
重点是:not_a_num不是数字而是字符串。我希望编译器抛出一个错误;相反,我得到一个具有两个字符串属性的对象。
另外,我声明了一个函数:
store(array: Array<{ str: string, num: number }>): Promise<any> { //... }
其中typeof(array [0] .num)解析为&#34; string&#34;当我传递一个包含对象x作为参数的数组时。
我的问题是:为什么我没有收到任何编译器警告/错误?如果我试图通过一些我显然不想传递的东西(因为我明确表示必须传递一个数字),如果我没有收到警告,那么制作类型注释有什么意义呢? 我觉得我在这里有一些根本的误解。
问候并谢谢你!
答案 0 :(得分:1)
问题是not_a_num
的输入为any
。并且any
与任何其他类型兼容。
let str = "";
let not_a_num:any = "";
const xWithAny: { str: string, num: any } = {
str: str,
num: not_a_num
};
const x: { str: string, num: number } = xx; // valid
类型兼容性是根据每个组件的兼容性确定的,因此在上面的代码xWithAny
与x
兼容,因为str
属性具有相同的类型,{{1 }}可以分配给num:any
。
问题是在运行时num:number
可以有任何有效值(因为它的类型为not_a_num
),因此any
最终可能成为字符串。
通常你应该避免使用num
,如果你使用它,你应该有意识地决定输入any
。通过启用any
。