假设我有这样的界面:
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
接口的有效属性名称。这可能吗?在这之后还有其他方法来实现我的安全吗?
答案 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';