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

