我正在尝试编写一个函数,它的参数是数组中特定对象的两个键。这些键如下:
- 用于索引特定对象的字符串
- 一个函数(我需要其参数类型)
对象数组如下:
const obj = [
{
name: "number",
func: (foo: number) => foo,
},
{
name: "string",
func: (foo: string) => foo,
},
{
name: "array",
func: (foo: string[]) => foo,
},
];
这是我的方法
type SingleObject = typeof obj[number];
type Name<T extends SingleObject> = T["name"];
type FuncParams<T extends SingleObject> = Parameters<T["func"]>;
const myFunc = async <T extends SingleObject>(
name: Name<T>,
params: FuncParams<T>
) => {
// Do something
};
我认为当调用
myFunc
并将"array"
作为第一个参数传递时,它应该会识别所涉及的对象并正确地分配其他键的参数(在这种情况下应为Parameters<(foo: string[] => foo)>
)。 显然不是这种情况,因为我可以毫无问题地执行以下操作。myFunc("number", ["fo"]); // Should only allow a number as the second parameter
myFunc("string", [34]); // Should only allow a string as the second parameter
myFunc("array", [34]); // Should only allow an array of strings as the second parameter
参考资料
Parameters<T["func"]>
在这种情况下会将params
转换为number | string | string[]
类型,因为T["func"]
只是聚合给定数组的所有类型。这就是它能够工作的原因。现在如何使其按照您想要的方式工作是一个有趣的问题。 - Hozeis