typescript - 为什么 Typescript 不能从泛型类型中解开这个可选?
问题描述
打字稿版本:3.3.1
type Foo<T extends string> = {
[key in T]: number | undefined;
};
function square(num: number) {
return num * num;
}
function doStuff<T extends string>(foo: Foo<T>, keys: T[]) {
return keys.map((key) => {
const number = foo[key];
return number && square(number);
// TS2345: Argument of type 'number | undefined' is not
// assignable to parameter of type 'number'.
// Type 'undefined' is not assignable to type 'number'.
});
}
从错误消息中,我看到打字稿将数字解析为number | undefined
. 因此,我希望 Typescript 会正确地将类型缩小到number
的上下文中number && ...
,但事实并非如此。为什么?有没有办法简单地修复它?
当我删除泛型并将类型中的所有T
s替换为string
s (而[key: string]
不是[key in T]
)时,它会起作用。
解决方案
推荐阅读
- python - 如何从特定值类型中获取平均值?
- python - 如何在 Gitlab CI/CD 管道中使用 Docker-Compose 运行 API 端点测试
- javascript - Javascript 地图对象文字不起作用,但 new Object() 有效
- apache-spark - S3 中针对 Athena Hive Hudi 对象的 Redshift 查询错误——频谱扫描错误:断言代码:15005
- eclipse - PyDev 说来自导入的未定义变量:AF_INET
- c - 如何将 Erlang Driver 实现为默认高效实现
- ethereum - 如何将币安钱包注入 Web3 而不是 Metamask?
- python - ValueError:数据基数不明确:x 大小:1 y 大小:0 确保所有数组包含相同数量的样本
- c++ - 运行相同的代码,旧计算机和新计算机一样快,这是真的吗?
- google-apps-script - OnOpen公式将谷歌工作表ID放入单元格?