You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

额外优化说明

  1. 给getMatrix添加返回值类型,让类型检查更严谨。
  2. 提取sent为sentPrefix,语义更清晰。
  3. 外层循环先创建对应空数组,从根源避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:12:57