首页 > 解决方案 > 自己的打字稿键

问题描述

我正在尝试创建一种可以使用它自己的键的类型并且似乎找不到解决方案的类型。这是我正在尝试做的简化版本:

type SpecialType = Record<string, (getter: <K extends keyof SpecialType>(key: K) => ReturnType<SpecialType[K]>) => any>

const yo: SpecialType = {
  a: get => {
    get('b') // ok, should return type string
    return 1 // returns number
  },
  b: get => {
    get('a') // ok, should return type number
    get('c') // should error
    return 'a' // returns string
  }
}

我定义的类型实际上并没有按预期工作。我正在寻找将get每个函数的参数限制为父对象的键,并且理想情况下能够根据它们在中使用的键知道该函数的返回类型get

我目前的思路是这样的;

type SpecialType<T extends Record<string, (getter: <K extends keyof T>(key: K) => ReturnType<T[K]>) => any>> = T

但是如果没有用户自己指定泛型(我试图避免),这是行不通的

标签: typescript

解决方案


您可以使用getter并利用Javascript 中的工作原理this完成类似的事情。当您在对象内定义函数时,this会自动将范围限定为包含对象,如下所示:

const specialType = {
  get a() {
    this.b; // string
    return 1; // returns number
  },
  get b(){
    this.a; // number
    return 'a'; // returns string
  },
};

这就是在 ES6 引入 class 关键字之前人们定义类的方式。这是做你想做的吗?


推荐阅读