首页 > 解决方案 > 打字稿区分联合与通用的,不健全的类型缩小

问题描述

以下代码使用 Typescript 3.5.3 成功编译,但似乎不应该被允许,我想知道为什么它会成功编译。我创建了一个类型A,它具有一个字段和一个参数化a的泛型函数,该函数接受一个参数,该参数是泛型和类型的区别联合。函数内部的守卫似乎正在缩小 to be 的类型,但是,您可以想象另一种具有不同字段的类型将通过此检查。tXXA'a' in ataABa

type A = {"a": string}
type B = {"a": number}

function t<X>(a: A | X, f: (x:X) => string): string {
  if ('a' in a) {
    return a.a;
  } else {
    return f (a);
  }
}

此外,我可以这样调用这个函数:

let a : A = {"a": "hi"};
let f = (x:B) => {
  return x.a + " a string";
}
let tmpa = t(a, f); // has static type string and correct dynamic type string
let b: B = {"a": 5};
let tmpb = t(b, f); // has static type string but dynamic type number

我知道 Typescript 的类型系统故意不健全,但我不明白为什么这个例子被允许不健全。任何见解将不胜感激。

标签: typescriptgenerics

解决方案


推荐阅读