首页 > 解决方案 > typescript 类型检查具有误导性,typescript 没有报告此类型错误

问题描述

与定义冲突但没有错误使我产生误导

type Ttest = 'a' | 'b'
function test1(k: Ttest, p: number | string){
  let aa: {a: number, b: string} = {a: 1, b: "2"};
// no error but conflict with definition that b should not be number 
  aa = {
    ...aa,
    [k]: p
  }
//  Type 'string | number' is not assignable to type 'never'. {why aa[k] is never, expect is string|number}
//  aa[k] = p
}

test1('b', 10);

演示

标签: javascripttypescript

解决方案


// Conflict with definition but no error
test1('b', 10);

对于上述错误,您的输入k被定义为Ttset只能是'a''b'如上定义的类型。由于您的输入'b'确实被认为是 type 的子集Ttset,因此它不会引发任何错误。

补充:我不认为打字稿会检查k代码的类型以及要覆盖的变量。

至于另一个错误,您已将 `aa` 定义为具有 2 个属性的对象,分别为数字和字符串的 `a` 和 `b`,它不识别任何第三个属性。因此,当您尝试解压 `aa` 并附加一个新属性时,它会给出 `never`,因为它不需要第三个属性。

特长; 它视为aa对象而不是字典!

编辑:事实证明我对答案的第二部分是错误的。

使用 spread 参数...可以覆盖对象中的属性。


推荐阅读