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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:12:40