使用默认值和对象解构分配时的 TypeScript 类型修改

TypeScript type modification when using defaults and object destructuring assignment

我 运行 今天使用 TypeScript (v3.5.1) 进入一个 st运行ge 案例,这让我感到困惑。我定义了一个带有可选 属性 的接口,但是 TypeScript 允许我在使用对象解构时将默认值设置为我想要的任何值:

interface IFoo {
    letter?: "a" | "b" | "c";
}

const foo: IFoo = {};

const { letter = 1 } = foo;

console.log(letter); // --> 1
                     // Type signature of `letter`: "a" | "b" | "c" | 1
                     // Why does TS modify the type to include 1?

运行这段代码在TypeScript playground.

通过一些类型检查,我注意到 TypeScript 正在将 "a" | "b" | "c" 的预期签名修改为 "a" | "b" | "c" | 1。当我尝试将 letter 默认为 1 时,我预计会出现类型错误。我在这里错过了什么吗?谢谢!

解构语句正在引入一个新变量。除非分配或在这种情况下推断出一个,否则它还没有类型。

查看向下编译的代码,这变得更加明显:

// const { letter = 1 } = foo;
var _a = foo.letter, letter = _a === void 0 ? 1 : _a;

或者稍微清理一下:

const letter = foo.letter === undefined ? 1 : foo.letter;

letterfoo.letter1 如果前者未定义。