TS中有没有一种方法来缩小对象属性的范围,例如排除undefined个值?

以下代码(TS playground):

interface Dict {
  [k: string]: {
    prop?: number;
  };
}

const d: Dict = {};

let a = "item";
const b = a;
const c = "item";

if (d[a].prop) {
  d[a].prop++ // Nope
}

if (d[b].prop) {
  d[b].prop++ // Neither
}

if (d[c].prop) {
  d[c].prop++ // OK
}

说明了当使用变量或作为这些变量副本的常量访问字典/对象值时,TypeScript会给我们一个关于潜在undefined个值的错误,即使试图缩小范围.它只在使用从文字定义的常量时起作用.

有没有一个/什么解决方案来避免这种行为?

推荐答案

你可以把d[a]保存到一个常数中,判断一下,然后再重复使用它:

const entry = d[a];
if (entry.prop) {
    entry.prop++; // OK
}

Playground link

即使a不是常数,因为entry是常数,所以TypeScript的流分析可以看到entry.prop已经缩小了.

Typescript相关问答推荐

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

node—redis:如何在redis timeSeries上查询argmin?

如何在函数参数中使用(或模仿)`success`的行为?

如何使函数接受类型脚本中具有正确类型的链接修饰符数组

如何使用函数填充对象?

如何在另一个参数类型中获取一个参数字段的类型?

是否有一个版本的联合类型递归地使属性只出现在一个可选选项中?

等待用户在Angular 函数中输入

限制返回联合的TS函数的返回类型

使用2个派生类作为WeakMap的键

如何编写在返回函数上分配了属性的类型安全泛型闭包

判断映射类型内的键值的条件类型

字符串文字联合的分布式条件类型

是否可以定义引用另一行中的类型参数的类型?

替换typescript错误;X类型的表达式可以';t用于索引类型Y;带有未定义

Select 类型的子项

Next 13 + React 18 createContext 类型的构建问题

剧作家测试未加载本地网址

有没有办法从不同长度的元组的联合中提取带有类型的最后一个元素?

为什么在 useState 中设置 React 组件是一种不好的做法?