考虑以下接口声明:
interface Foo {
bar(keys: string[], handler: (parameter: any) => void): void;
}
如何表示处理程序的parameter
是一个对象,其成员的键位于keys
数组中?
var x: Foo;
x.bar(['First', 'Second'], x => {
console.log(x.First);
console.log(x.Second);
});
答案 0 :(得分:1)
你想要
(1)可以使用约束为string
的类型参数(即通用)来完成,而(2)可以使用映射类型完成 - 而恰好是TypeScript发布了一个被调用的映射类型Record<K, T>
用它:
interface Foo {
bar<K extends string>(keys: K[], handler: (parameter: Record<K, any>) => void): void;
}
var x: Foo;
x.bar(['First', 'Second'], x => {
console.log(x.First);
console.log(x.);
});
但是,请记住,如果有人传入空数组或字符串文字以外的其他内容(例如string
类型的变量),那么您将无法获得类型安全性。您可以访问x
上的任何媒体资源。
你可以通过添加通用默认值never
来解决空数组的情况,并说明#34;当给出一个空数组时,推断空联合而不是string
&#34;:
interface Foo {
bar<K extends string = never>(keys: K[], handler: (parameter: Record<K, any>) => void): void;
}
答案 1 :(得分:0)
您可以使用mapped types将数组中的每个项目映射为键:
pressmove