【发布时间】:2021-04-04 18:30:46
【问题描述】:
TSC 给出一个错误,它作为注释添加到代码中。
tsconfig:"noUncheckedIndexedAccess": true
type Tfactors = [number, number, number, number];
export default function changeEnough(pocket: Tfactors, bill: number): boolean {
const coinToDolarFactors: Tfactors = [0.25, 0.1, 0.5, 0.01];
let pocketTotal = 0;
for (let i in pocket) {
if (pocket[i] !== undefined && coinToDolarFactors[i] !== undefined) {
//Object is possibly 'undefined'.ts(2532)
pocketTotal += pocket[i] * coinToDolarFactors[i];
}
}
return pocketTotal >= bill;
}
我这样解决了这个问题:
type Tfactors = [number, number, number, number];
export default function changeEnough(pocket: Tfactors, bill: number): boolean {
const coinToDolarFactors: Tfactors = [0.25, 0.1, 0.5, 0.01];
let pocketTotal = 0;
for (let i in pocket) {
const pocketValue = pocket[i];
const factor = coinToDolarFactors[i];
if (pocketValue !== undefined && factor !== undefined) {
pocketTotal += pocketValue * factor;
}
}
return pocketTotal >= bill;
}
我是 TypeScript 的新手,我不知道这是解决此问题的最佳方法。我可以在不声明pocketValue 和factor 变量以及不使用! 使TSC 静音的情况下解决这个问题吗?
【问题讨论】:
-
我在打字稿操场上看不到问题。
-
"noUncheckedIndexedAccess": true
-
typescript 没有深入到类型保护
pocket[i]和coinToDolarFactors[i],因此在ifblock 内,它丢失了该类型保护的上下文。也就是说,您使用const的方法效果很好,因为 TS 肯定知道它在const分配中是未定义的;或者,你可以for (let _i in pocket) { const i = _i as '0'|'1'|'2'|'3'; ...},因为Tfactors是一个元组类型。 -
@ABOS as '0'|'1'|'2'|'3' 是一种硬编码。但我已经定义了一个元组。为什么元组不保证索引在范围内?
标签: arrays typescript undefined typeguards