没有类型警告,我期望他们

时间:2017-12-11 13:19:14

标签: typescript

我按如下方式声明一个对象:

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作为参数的数组时。

我的问题是:为什么我没有收到任何编译器警告/错误?如果我试图通过一些我显然不想传递的东西(因为我明确表示必须传递一个数字),如果我没有收到警告,那么制作类型注释有什么意义呢? 我觉得我在这里有一些根本的误解。

问候并谢谢你!

1 个答案:

答案 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

类型兼容性是根据每个组件的兼容性确定的,因此在上面的代码xWithAnyx兼容,因为str属性具有相同的类型,{{1 }}可以分配给num:any

问题是在运行时num:number可以有任何有效值(因为它的类型为not_a_num),因此any最终可能成为字符串。

通常你应该避免使用num,如果你使用它,你应该有意识地决定输入any。通过启用any

,打字稿编译器可以提供帮助