TypeScript含未知键类型对象报错:无法读取undefined的push属性
问题描述
我是TypeScript新手,目前很喜欢这门语言,但遇到了一个困扰许久的问题:
我有一个字符串数组,尝试计算元素长度的乘积来生成矩阵,代码如下:
const corpus: string[] = ["a","ab","b","cvf"]; type distances = { [key: string]: number[] }; const getMatrix = (data: string[]) => { let inc: number = 1; let sent: string = "Sentence_"; let struct: distances = <distances>{}; for (let da of data) { for (let d of data) { struct[`${sent}${inc}`].push(da.length * d.length) } inc++; } } getMatrix(corpus);
这段代码无法运行,报错信息为:
TypeError: Cannot read properties of undefined (reading 'push')
我期望的输出结构如下:
{ Sentence_1: [1,2,3,4], // random values Sentence_2: [1,2,3,4], // random values etc.. }
我已阅读多篇类型相关文章,但仍未找到问题所在。请问我哪里出错了?预定义的distances类型为何会导致该问题?
问题分析与修复
核心错误原因
- 调用
struct[${sent}${inc}].push()时,struct[${sent}${inc}]还未被初始化,此时它是undefined,自然无法调用push方法。 distances只是TypeScript的类型定义,仅在编译阶段检查结构是否合规,不会在运行时自动创建数组实例——TypeScript不干预运行时的变量初始化逻辑。
修复后的代码
const corpus: string[] = ["a","ab","b","cvf"]; // 类型名遵循大驼峰规范,符合TS通用约定 type Distances = { [key: string]: number[] }; const getMatrix = (data: string[]): Distances => { const struct: Distances = {}; let inc = 1; const sentPrefix = "Sentence_"; for (const da of data) { // 先初始化当前句子对应的空数组,再执行push操作 const key = `${sentPrefix}${inc}`; struct[key] = []; for (const d of data) { struct[key].push(da.length * d.length); } inc++; } // 返回结果,方便后续使用 return struct; } const result = getMatrix(corpus); console.log(result);
额外优化说明
- 给
getMatrix添加返回值类型,让类型检查更严谨。 - 提取
sent为sentPrefix,语义更清晰。 - 外层循环先创建对应空数组,从根源避免
undefined调用方法的错误。
运行结果
执行修复后的代码,会得到符合预期的结构:
{ Sentence_1: [1, 2, 1, 3], Sentence_2: [2, 4, 2, 6], Sentence_3: [1, 2, 1, 3], Sentence_4: [3, 6, 3, 9] }
内容的提问来源于stack exchange,提问作者Louloumonkey
相关产品推荐
相关产品推荐

