是否可以定义此功能
function magic(...propertyNames:string[]): { ????? : any }
{
....
}
在这种情况下,返回的类型将具有 propetyNames 中列出的属性?
例如:
type ResultType = {alpha:any, bravo:any};
let res = magic('alpha', 'bravo'); // res is compatible with ResultType
答案 0 :(得分:1)
以下是可能导致magic
发生的解决方案:
declare function magic<T extends string[]>(
...propertyNames: T
): Record<T[number], any>;
const result = magic("alpha", "bravo");
type ResultType = typeof result; // {alpha: any; bravo: any;}
测试ResultType
:
const t1: ResultType = {
alpha: "foo",
bravo: 42,
wannaBe: 3 // error (OK)
};
然后您可以通过附加的类型参数进一步限制any
中的Record<T[number] any>
类型,因为any
不提供任何有用的类型。
declare function magic<T extends string[], R>(
...propertyNames: T
): Record<T[number], R>;
T[number]
为我们提供了所有项目值作为联合类型。例如。 type T = ["alpha", "bravo"]
type TItems = T[number] // "alpha" | "bravo"
Record
确保将所有项值"alpha" | "bravo"
作为属性键。