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

