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

TypeScript中基于参数类型推导函数类型参数的技术问题

如何在TypeScript中让函数类型参数约束context.Foo的参数键

你已经写出了一个能完美满足需求的实现!咱们来拆解下这段代码的逻辑,以及如果有扩展需求可以怎么优化:

首先看你现有的可运行代码:

interface Context<T> { 
  Foo(key: keyof T) 
}
function fun<T>(provider: (context: Context<T>) => T): number { 
  return 1 
}
fun<{a: number}>(context => { return {a: context.Foo('a')} })

为什么这段代码能生效?

  • 你通过Context<T>接口,把Foo方法的参数直接约束为keyof T,这就从类型层面锁死了:调用Foo时只能传入T类型上存在的键名。
  • 函数fun的类型参数T同时绑定了两个地方:一是回调函数provider的返回值类型,二是传入回调的Context<T>的类型。这形成了一个完美的闭环——你返回的对象的键必须和Foo能接受的键完全对应,所以在调用fun<{a: number}>时,IDE会自动提示你只能传'a'给context.Foo,完全符合你的约束要求。

扩展优化:让Foo返回值匹配对应键的类型

如果希望context.Foo(key)的返回值自动和T中对应键的类型匹配,可以给Foo方法添加一个更具体的泛型约束:

interface Context<T> { 
  // 新增泛型K,约束为keyof T,返回值直接对应T[K]
  Foo<K extends keyof T>(key: K): T[K] 
}
function fun<T>(provider: (context: Context<T>) => T): number { 
  return 1 
}

// 此时context.Foo('a')会被推断为number,context.Foo('b')为string
fun<{a: number, b: string}>(context => { 
  return {
    a: context.Foo('a'),
    b: context.Foo('b')
  } 
})

这样不仅约束了传入的键,还能让返回值类型完全对齐,类型安全性更进一步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:17