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
相关产品推荐
相关产品推荐

