javascript - 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
。
因此,如果您更改Status
为Key2
then 您只能key2
作为第二个参数传递,因为key2
它是 type Key2
。
我不确定这是否可以使用 TypeScript。我想我需要做一些递归泛型,但我不确定该怎么做。
解决方案
您可以隐秘地检查键的值是否扩展了所需的类型:
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"'.
推荐阅读
- kubernetes - kubernetes如何调用完整的服务名称而不是AWS节点ip
- ubuntu - qemu-system-x86_64:设备 ide-cd 初始化失败:无法获得共享“写”锁
- google-apps-script - 用于从 Gmail 中提取数据并在 Google 表格中填写匹配行的 Google Apps 脚本
- android - 如何使用 WebView Android 拦截 http 表单数据
- reactjs - 超过最大更新深度。React 限制了嵌套更新的数量以防止无限循环。也许 Firebase 现在已经更新了
- mongodb - 在防火墙系统中使用 pymongo
- jquery - Nodejs - 你能帮我使用会话更新购物车吗?
- flutter - 如何在颤动中制作可拖动的圆形谷歌地图
- r - 使用 If Else 语句在 R 中编写不同的 csv 文件
- java - 使用 JPAQueryFactory 解释