理论上,他应该发誓unknownLengthResArray: []
,该方法声明这是一个对象数组,应该有key
const args = {
unknownLengthResArray: [],
t,
keyName: 'service',
namespace: 'services'
}
const sectionBody = unknownLengthDatagridRowSectionBody(args)
interface IInnerObject {
key: string;
}
type TArgsType = {
unknownLengthResArray?: IInnerObject[];
t: any;
keyName: string;
namespace: string;
}
type TReturnType = Dictionary<string>[];
export const unknownLengthDatagridRowSectionBody = ({
unknownLengthResArray,
t,
keyName,
namespace
}: TArgsType): TReturnType => {
const sectionBody = []
if(unknownLengthResArray?.length) {
let section = {}
let denominator = 3
unknownLengthResArray.forEach(({ key }, i) => {
const sectionInfo = {
[`${t(keyName)} ${i+1}`]: t(`${namespace}:${key}`)
}
while(i < denominator){
section = {...section, ...sectionInfo}
return
}
sectionBody.push(section)
section = {}
denominator += denominator
})
}
return sectionBody
}
因为空数组仍然是数组:当带有值的变量
[]
的类型声明为普通数组时,无论数组元素的类型如何,都非常尊重类型对应。这是键入“emptiness”的期望,缺少无法按定义键入的值(特殊类型除外
never
,在我看来,它不适用于此处)。简单地说:当数组中没有内容时,就没有什么要检查类型匹配的了。
如何声明一个非空类型对象数组的类型:
TS游乐场
Node.js 数组索引是连续的,因此具有至少一个值的数组总是在 index 处有一个元素
0
。同时,如果您允许在值中“跳过”(例如)具有两个元素的数组,在 index 处添加另一个元素,
3
则类型检查将起作用 - 即,应该发生错误(以及那里的图) TS 出于某种原因不能/不想检查中间索引中值的类型(这里是2
带值的索引undefined
),必须考虑到这样的细微差别:理想情况下,不允许有间隙,注意你的常量和索引显式赋值;以及过滤/转换来自外部(例如,来自后端)的输入,TS 无论如何都无法验证。