首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有索引类型的TypeScript泛型curried函数

具有索引类型的TypeScript泛型curried函数
EN

Stack Overflow用户
提问于 2018-12-18 07:13:54
回答 1查看 508关注 0票数 4

我创建了一个TypeScript curried函数,它首先接收一个字符串形式的属性名,然后接收从中获取该属性值的对象。我使用了索引类型来确保每当我试图访问一个不存在的属性时都会得到一个错误:

代码语言:javascript
运行
复制
export interface Dict {
  name: string;
  age: number;
}

const prop = <T extends Dict, K extends keyof T>(p: K) => (obj: T): T[K] => obj[p];

prop('name')({name: 'John', age: 45});  // John
prop('name2')({name: 'John', age: 45});  // error...

最后一行给出了错误:

代码语言:javascript
运行
复制
error TS2345: Argument of type '"name2"' is not assignable to parameter of type '"name" | "age"'.

这正是我想要的,因为在作为第二个参数给出的对象上不存在属性name2

然而,当我尝试使用一个可能的monad来创建一个安全版本时,它给出了一个类似的错误:

代码语言:javascript
运行
复制
const safeProp = <T extends Dict, K extends keyof T>(p: K) => (obj: T): Maybe<{}> => compose2(Maybe.of, prop(p))(obj);

错误出现在compose2函数的第二个参数上:prop(p)

代码语言:javascript
运行
复制
Argument of type 'K' is not assignable to parameter of type '"name" | "age"'.

我不明白这一点,因为我声明了K extends keyof T,我认为它是正确的,因为它也适用于prop函数。

作为参考,compose2函数:

代码语言:javascript
运行
复制
const compose2 = <A, B, C>(f: (b: B) => C, g: (a: A) => B): ((a: A) => C) => a => f(g(a));

以及Maybe monad的相关部分:

代码语言:javascript
运行
复制
class Maybe<A> {
  static of<A>(x: A): Maybe<A> {
    return new Maybe(x);
  }

  ...
}

如何正确键入safeProp函数?为什么需要将其返回类型指定为Maybe<{}>而不是Maybe<T[K]>

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53824319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档