是否可以将字符串验证为接口的属性名称?

时间:2016-03-10 00:35:00

标签: typescript

假设我有这样的界面:

interface User {
    id: string;
    name: string;
    age: number;
}

我有一个这样的方法:

function getUserValues(properties:string[]):void {
    Ajax.fetch("user", properties).then((user:User) => alert(user));
}

好的电话看起来像这样:

getUserValues("id", "name", "age");

但这会导致错误:

getUserValues("bogus", "stuff", "what_even_am_i_doing");

我想要的是验证properties是否包含 User接口的有效属性名称。这可能吗?在这之后还有其他方法来实现我的安全吗?

2 个答案:

答案 0 :(得分:1)

您可以使用keyof来实现此目标:

function get<T, K extends keyof T>(obj: T, propertyName: K): void { ... };

答案 1 :(得分:0)

  

我想要的是验证属性只是用户界面的有效属性名称。还有其他方法来实现我在这之后的安全吗?

你需要在联合中使用字符串文字类型:

function getUserValues(properties:('id'|'name'|'age')[]):any[] {
    Ajax.fetch("user", properties).then((user:User) => alert(user));
}

您可以使用代码生成从接口生成联合类型。

更多

https://basarat.gitbooks.io/typescript/content/docs/types/stringLiteralType.html

通过界面自动

此刻无法完成。这并不是声明“此接口的有效属性名称是此字符串文字联合的成员”的声明方式。可以生成代码来执行以下操作:

interface User {
    id: string;
    name: string;
    age: number;
}
// Generated. Or kept in sync with the `User` interface manually 
type UserPropertyNames = 'id' | 'name' | 'age';