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

TypeScript处理K8s对象时hasOwnProperty始终返回false问题排查

问题:TypeScript匹配K8s PipelineRun的taskRuns属性时始终进入else分支

场景与代码

我用TypeScript处理K8s的PipelineRun对象,对应的JSON结构如下:

{
 "startTime": "2022-12-01T19:15:58Z",
  "taskRuns": {
     "task1": {
        "pipelineTaskName": "task1Ref",
         "status": {
             "completionTime": "2022-12-01T19:17:27Z",
              "conditions": [
                 {
                   "lastTransitionTime": "2022-12-01T19:17:27Z",
                   "message": "",
                   "reason": "TaskRunImagePullFailed",
                   "status": "False",
                   "type": "Succeeded"
                  }
               ]}},
   "task2":{/* 与task1字段相同 */},
   "task3": {/* 与task1字段相同 */}
}}

存储TaskRun名称的数组:

["task1","task2",....]

对应的TypeScript接口定义:

export interface PipelineRunStatus {
  startTime: string;
  taskRuns: Truns;
}
export interface Truns {
  [key: string]: TaskRun;
}
export interface TaskRUn { /* 对应上述task1的字段 */ }

我尝试将数组元素与taskRuns中的键匹配并提取信息,代码如下:

type taskRunKey = keyof typeof currentRun.Status.taskRuns
// taskRuns是我的字符串数组
taskRuns.map((taskRunName: string) => {
  console.log(taskRunName)

  if (currentRun?.Status?.taskRuns?.hasOwnProperty(taskRunName as taskRunKey))
       console.log(currentRun.Status?.taskRuns[taskRunName as status?.conditions[0])
   else {
       console.log(currentRun?.Status?.taskRuns)
       console.log(currentRun?.Status)
    }
})

问题现象

运行后输出如下:

task1
undefined
Object { TaskRuns: {… task1:{..上述对象...}}}

task2
undefined
Object { TaskRuns: {… 与上述对象类似...}}

明明taskRuns中存在与数组元素完全匹配的属性,但代码始终进入else分支。


原因分析与解决方法

1. 属性名大小写不匹配(核心问题)

从输出日志可以看到,实际返回的对象中属性是**TaskRuns(首字母大写),但你的代码和接口定义里都用了taskRuns(首字母小写)**。这直接导致currentRun?.Status?.taskRuns为undefined,自然无法通过hasOwnProperty检测到匹配的键,从而进入else分支。

2. 代码语法错误

你的console.log语句存在语法错误:

// 错误写法
console.log(currentRun.Status?.taskRuns[taskRunName as status?.conditions[0])

这里的as status?.conditions[0]完全不符合语法,应该修正为正确的类型断言和属性访问:

// 修正后(注意属性名改为TaskRuns)
console.log(currentRun.Status?.TaskRuns[taskRunName as taskRunKey]?.status?.conditions[0])

3. 接口拼写错误

接口TaskRUn拼写错误,应该改为TaskRun,避免TypeScript类型提示异常:

// 修正前
export interface TaskRUn { /* 字段 */ }
// 修正后
export interface TaskRun { /* 字段 */ }

最终修正后的代码示例

type taskRunKey = keyof typeof currentRun.Status.TaskRuns
taskRuns.map((taskRunName: string) => {
  console.log(taskRunName)
  const taskRunsObj = currentRun?.Status?.TaskRuns
  if (taskRunsObj?.hasOwnProperty(taskRunName as taskRunKey)) {
    const targetTaskRun = taskRunsObj[taskRunName as taskRunKey]
    console.log(targetTaskRun?.status?.conditions[0])
  } else {
    console.log(taskRunsObj)
    console.log(currentRun?.Status)
  }
})

内容的提问来源于stack exchange,提问作者ndp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:05:38