如何在TypeScript中强制函数仅接受特定函数的返回值?
TypeScript 实现仅接受指定函数返回值的类型约束
要实现让fn只接受x()的返回值、拒绝y()的需求,核心是让TypeScript区分相同字面量但不同来源的值——默认情况下,x()和y()返回的都是3,TypeScript会把它们视为同一个number类型,所以我们需要给x的返回值打上唯一的类型标记。
实现方案1:显式定义独特标记类型
// 定义带唯一标记的类型,确保只有x的返回值能匹配 type XResult = number & { readonly __brand: unique symbol } const x = () => { // 将返回值断言为XResult类型 return 1 + 2 as XResult } const y = () => { return 1 + 2 } type TArg = XResult const fn = (arg: TArg) => { console.log(arg) } fn(y()) // ❌ 类型错误:普通number无法赋值给带标记的XResult fn(x()) // ✅ 完全合法
实现方案2:利用ReturnType简化写法
如果不想单独定义类型,可以直接通过ReturnType获取x的返回类型:
const x = () => { // 直接给返回值打上唯一标记 return 1 + 2 as number & { __brand: unique symbol } } const y = () => { return 1 + 2 } // 直接复用x的返回类型作为TArg type TArg = ReturnType<typeof x> const fn = (arg: TArg) => { console.log(arg) } fn(y()) // ❌ 类型错误 fn(x()) // ✅ 合法
原理说明
unique symbol是TypeScript的特殊类型,每个unique symbol实例都是独一无二的,通过把它和number做交集,我们得到了一个只有x的返回值能满足的专属类型。- 这种方式不会影响运行时逻辑——标记类型在编译后会被完全移除,运行时
x()的返回值还是普通的数字3,只是在编译阶段给TypeScript提供了区分依据。
内容的提问来源于stack exchange,提问作者Armen
相关产品推荐
相关产品推荐

