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

TypeScript如何实现仅要求入参可能匹配指定类型的软类型检查?

实现方案

你需要的Possibly泛型可以通过 TypeScript 条件类型和泛型函数实现,核心逻辑是校验输入值的类型与目标类型是否存在非never的交集:

// 泛型参数说明:Expected 是你期望匹配的目标类型,T 是实际传入值的类型
type Possibly<Expected, T> = Extract<T, Expected> extends never ? never : T

基础场景使用示例

对应你举的字符串字面量校验场景:

// 定义类型校验函数,用泛型接收输入值的类型
function isA<T>(value: Possibly<"A", T>) {
  return value === "A"
}

const x: "A"|"B" = "B"
isA(x) // 编译通过:x 存在是 "A" 的可能性

const y: "B"|"C" = "B"
isA(y) // 编译报错:类型 "B" | "C" 无法分配给类型 "never",y 完全不可能是 "A"

复杂对象场景使用示例

对应你提到的嵌套类型校验场景:

type A = {
  one: number;
  two: number;
}

function isA<T>(value: Possibly<A, T>) {
  return typeof value == "object" && value !== null && "one" in value && "two" in value && typeof value.one === "number" && typeof value.two == "number";
}

isA({}) // 编译报错:空对象完全不可能匹配类型 A
isA({} as {one?: number; two?: number}) // 编译通过:该类型存在符合 A 的可能性
isA(undefined) // 编译报错:undefined 完全不可能匹配类型 A
isA(undefined as undefined | A) // 编译通过:联合类型存在符合 A 的可能性

补充说明

  • 输入值类型为unknown时会正常通过,符合逻辑:unknown确实存在匹配目标类型的可能性
  • 输入值类型为any时也会通过,属于 TypeScript 对any类型的默认兼容规则
  • 无需手动传入泛型参数T,TypeScript 会自动根据入参推导类型,使用成本和普通函数一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:57:05