使用默认值和对象解构分配时的 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;
letter
是 foo.letter
或 1
如果前者未定义。
我 运行 今天使用 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;
letter
是 foo.letter
或 1
如果前者未定义。