我有:
interface MyInterface {
a: string;
b: number;
}
我有另一个通用功能:
myFunction(myInstance: MyInterace, fieldName: string) {
let field = myInstance[fieldName];
// do something with this field
}
用途:
myFunction(myInst, "a");
or
myFunction(myInst, "b");
然而,我想通过";a";或";b";以类型安全的方式。这意味着,如果我将MyInterace a字段更改为a2,myFunction中使用的调用(myInst,"a"(将无法编译,并且我可以在编译时找到所有由于重命名而损坏的地方。
我尝试使用Pick,但无法从中获取字段的名称。
有什么建议吗?我想应该有一些:
MyInterace::a from which I could extra the string "a".
您只需要将fieldName
声明为类型keyof MyInterface
function myFunction(myInstance: MyInterface, fieldName: keyof MyInterface) {
let field = myInstance[fieldName];
// do something with this field
}
myFunction({ a: 'a', b: 1 }, 'a')
myFunction({ a: 'a', b: 1 }, 'b')
myFunction({ a: 'a', b: 1 }, 'c') // type error
游乐场
或者作为一个更高级的版本,您可以使其通用,然后它将适用于任何类型,而不仅仅是MyInterface
。
现在,您将任何类型传递给myInstance
,无论该类型是什么,fieldName
都必须是keyof
function myFunctionGeneric<T>(myInstance: T, fieldName: keyof T) {
let field = myInstance[fieldName];
// do something with this field
}
myFunctionGeneric({ foo: 'a', bar: 1 }, 'foo')
myFunctionGeneric({ foo: 'a', bar: 1 }, 'bing') // type error
当然,只有在需要的时候才使用这个通用版本,因为它会给你可能根本不需要的东西带来复杂性。
游乐场