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

TypeScript 4.9:解决'in'运算符NonNullable<K>类型报错(2638)的方法

解决TypeScript 4.9中in运算符的TS2638错误

在TypeScript 4.9的严格类型检查逻辑下,当泛型参数约束为K extends KeyOrId | null时,即便通过!keyOrId排除了null值,TypeScript仍无法确定NonNullable<K>必然是对象类型,导致执行'id' in keyOrId时触发TS2638错误。以下是几种可行的解决方式:

方式一:使用类型断言明确类型

直接将非空后的keyOrId断言为KeyOrId,让TypeScript确认其为对象类型:

export type KeyOrId =
  | {
      key: string;
    }
  | {
      id: string;
    };

export default function foo<K extends KeyOrId | null>(
  keyOrId: K,
) {
    if (!keyOrId) {
      return undefined;
    }

    return 'id' in (keyOrId as KeyOrId);
}

方式二:添加自定义对象类型守卫

通过自定义类型守卫函数,精准判断keyOrId是对象且非空,帮助TypeScript缩小类型范围:

export type KeyOrId =
  | {
      key: string;
    }
  | {
      id: string;
    };

function isNonEmptyObject(value: unknown): value is object {
  return typeof value === 'object' && value !== null;
}

export default function foo<K extends KeyOrId | null>(
  keyOrId: K,
) {
    if (!isNonEmptyObject(keyOrId)) {
      return undefined;
    }

    return 'id' in keyOrId;
}

方式三:调整泛型约束(若无需保留泛型灵活性)

如果不需要泛型带来的类型推导灵活性,直接将参数类型设为KeyOrId | null,TypeScript可直接识别非空值为对象:

export type KeyOrId =
  | {
      key: string;
    }
  | {
      id: string;
    };

export default function foo(
  keyOrId: KeyOrId | null,
) {
    if (!keyOrId) {
      return undefined;
    }

    return 'id' in keyOrId;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:25:26