Javascript FlowType:函数的返回类型(k)=>;obj[k]

Javascript FlowType:函数的返回类型(k)=>;obj[k],javascript,flowtype,Javascript,Flowtype,我有一个用户对象: type User = { name: string, }; 它有一个get()函数,该函数接受User上属性的键并返回该属性。 函数get是 User.prototype.get = (prop) => { return this[prop]; }; 如何编写此函数定义? 以下是我目前得到的信息: type User = { name: string, get: (k: $Keys<User>) => any, // How ca

我有一个
用户
对象:

type User = {
  name: string,
};
它有一个
get()
函数,该函数接受
User
上属性的键并返回该属性。 函数get是

User.prototype.get = (prop) => {
  return this[prop];
};
如何编写此函数定义? 以下是我目前得到的信息:

type User = {
  name: string,
  get: (k: $Keys<User>) => any, // How can I change any to the correct property type ?
};
类型用户={
名称:string,
get:(k:$Keys)=>any,//如何将any更改为正确的属性类型?
};

似乎您现在可以使用
$ElementType
。 待确认

资料来源:


编辑:

/*@flow*/
类型用户={
名称:string,
年龄:数字,,
}
常量用户:用户={
姓名:“Ilyes”,
年龄:21岁,
}
函数get(键:K):$ElementType{
返回用户[键];
}
常量编号:number=get('name');//错误
常量number2:number=get('age');//作品
常量字符串:string=get('name');//作品
常量string2:string=get('age');//错误

预期的类型是什么<代码>字符串?如果要将
age:number
属性添加到
User
,它会是
string | number
?是的。但是返回类型应该是
obj[prop]
的返回类型,因此我们可以更精确地进行类型检查。如果使用“name”调用,则预期类型为“string”,如果使用“age”调用,则预期类型为“number”。我不知道现在使用Flow是否可以进行这种动态键入不确定Flow,但在TypeScript中您可以编写
get(key:t):User[t]
/* @flow */

type User = {
  name: string,
  age: number,
}

const user: User = {
  name: 'Ilyes',
  age: 21,
}

function get<K: string>(key: K): $ElementType<User, K> {
  return user[key];
}

const number: number = get('name'); // error
const number2: number = get('age'); // works
const string: string = get('name'); // works
const string2: string = get('age'); // error