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

TypeScript无法识别函数参数为对象类型导致报错该如何解决?

问题原因

你遇到的两处报错本质是以下三个问题导致的:

  • 泛型T没有添加非对象类型约束,TypeScript 无法排除T本身就是对象类型的可能,因此typeof input === "object"的判断无法将T从联合类型中排除,读取value属性时会提示属性不存在。
  • 缺少null判断:typeof null的返回值为object,如果输入为null会误进入对象判断分支,触发运行时报错。
  • 无约束的泛型T可能和对象类型重合,导致else分支的返回值无法匹配T | undefined的类型要求。
修复方案

首先给泛型添加非对象类型约束,同时调整类型收窄逻辑,修复后代码如下:

// 先定义非对象类型,覆盖所有合法的基础值类型
type NonObject = string | number | boolean | null | undefined | symbol | bigint;

const extractValue = <T extends NonObject>(input: T | { value?: T, [k: string]: unknown }): T | undefined => {
  // 先排除null,再判断是否为对象类型
  if (input !== null && typeof input === "object") {
    return input.value;
  }
  return input;
};
效果验证

可以通过以下测试用例验证类型匹配符合预期:

extractValue(123); // 输出: 123,类型推导为 number
extractValue('test'); // 输出: 'test',类型推导为 string
extractValue({ value: 456 }); // 输出: 456,类型推导为 number | undefined
extractValue({ value: 'hello' }); // 输出: 'hello',类型推导为 string | undefined
extractValue({ otherKey: 123 }); // 输出: undefined,类型推导为 undefined
extractValue(null); // 输出: null,类型推导为 null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:05