数组元素 "possibly undefined" 错误的类型保护
Type guard for array element's "possibly undefined" error
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 静音的情况下解决这个问题吗?
从文档Pedantic Index Signature Checks (--noUncheckedIndexedAccess),我们知道
One consequence of using --noUncheckedIndexedAccess
is that indexing into an array is also more strictly checked, even in a bounds-checked loop.
Under this new mode, every property access (like foo.bar
) or indexed access (like foo["bar"]
) is considered potentially undefined
.
解决方案:
如果您需要访问那个 属性,您要么必须先检查它是否存在,要么使用非空断言运算符(后缀 ! 字符)。
// Checking if it's really there first.
const pocketValue = pocket[i];
const factor = coinToDolarFactors[i];
if (pocketValue !== undefined && factor !== undefined) {
pocketTotal += pocketValue * factor;
}
// Basically saying "trust me I know what I'm doing"
// with the '!' non-null assertion operator.
pocketTotal += pocket[i]! * coinToDolarFactors[i]!;
如果您不想使用!
来屏蔽TSC或将数组元素分配给新变量,您可以显式键入数组索引,即
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) {
/* -- type it explicitly here -- */
let i = _i as Exclude<keyof Tfactors, keyof []>;
// *if* check is not required if you are confident they are defined at runtime
if (pocket[i] !== undefined && coinToDolarFactors[i] !== undefined) {
//Object is possibly 'undefined'.ts(2532)
pocketTotal += pocket[i] * coinToDolarFactors[i];
}
}
return pocketTotal >= bill;
}
Can I solve this problem without declaring pocketValue and factor variables [or] without use ! to mute TSC.
不,不幸的是你不能。
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 静音的情况下解决这个问题吗?
从文档Pedantic Index Signature Checks (--noUncheckedIndexedAccess),我们知道
One consequence of using
--noUncheckedIndexedAccess
is that indexing into an array is also more strictly checked, even in a bounds-checked loop.
Under this new mode, every property access (like
foo.bar
) or indexed access (likefoo["bar"]
) is considered potentiallyundefined
.
解决方案:
如果您需要访问那个 属性,您要么必须先检查它是否存在,要么使用非空断言运算符(后缀 ! 字符)。
// Checking if it's really there first.
const pocketValue = pocket[i];
const factor = coinToDolarFactors[i];
if (pocketValue !== undefined && factor !== undefined) {
pocketTotal += pocketValue * factor;
}
// Basically saying "trust me I know what I'm doing"
// with the '!' non-null assertion operator.
pocketTotal += pocket[i]! * coinToDolarFactors[i]!;
如果您不想使用!
来屏蔽TSC或将数组元素分配给新变量,您可以显式键入数组索引,即
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) {
/* -- type it explicitly here -- */
let i = _i as Exclude<keyof Tfactors, keyof []>;
// *if* check is not required if you are confident they are defined at runtime
if (pocket[i] !== undefined && coinToDolarFactors[i] !== undefined) {
//Object is possibly 'undefined'.ts(2532)
pocketTotal += pocket[i] * coinToDolarFactors[i];
}
}
return pocketTotal >= bill;
}
Can I solve this problem without declaring pocketValue and factor variables [or] without use ! to mute TSC.
不,不幸的是你不能。