TypeScript-以类型安全的方式传递接口的字段名



我有:

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

当然,只有在需要的时候才使用这个通用版本,因为它会给你可能根本不需要的东西带来复杂性。

游乐场

相关内容

  • 没有找到相关文章

最新更新