首页 > 解决方案 > TypeScript:是否可以制作一个使用泛型类型的函数来确定它可以将对象的哪个键作为其参数

问题描述

对不起,如果标题听起来令人困惑。本质上,我想做的是我想创建一个函数,该函数接受一个对象和该对象的键,其中键可能嵌套在对象内部,并且必须是泛型中指定的特定类型。所以喜欢

type Key = {
  key1: Key1;
};
type Key1 = {
  key2: Key2;
};
type Key2 = {
  status: Status;
};

type Status = "Active" | "Inactive";
interface MyObject {
  key: Key;
}

const myObject: MyObject = {
  key: {
    key1: {
      key2: {
        status: "Active"
      }
    }
  }
};


//  this is the function I am trying to build
foo<MyObject, Status>(myObject, 'status')

这里我有一个函数foo,它有两个参数。第二个参数是key对象上的 a(它可以嵌套,所以它不一定在对象的初始级别),它是类型Status,在这种情况下,我们可以传递的键是status

因此,如果您更改StatusKey2then 您只能key2作为第二个参数传递,因为key2它是 type Key2

我不确定这是否可以使用 TypeScript。我想我需要做一些递归泛型,但我不确定该怎么做。

标签: javascripttypescript

解决方案


您可以隐秘地检查键的值是否扩展了所需的类型:

type KeysOfType<T, TValue> = {
    [K in keyof T]: T[K] extends TValue ? K : T[K] extends object ? KeysOfType<T[K], TValue> : never
}[keyof T];

declare function foo<TObject, TValue>(obj: TObject, key: KeysOfType<TObject, TValue>): void;

foo<MyObject, Status>(myObject, 'status')
foo<MyObject, Status>(myObject, 'bar') // Argument of type '"bar"' is not assignable to parameter of type '"status"'.

操场


推荐阅读