在Javascript / Typescript中是否可以编写一个将参数名称/键作为字符串返回的函数?
function foo(arg) {...}
let user = new User();
foo(user.userId) // => returns string: "userId"
foo(user.name) // => returns string: "name"
出于我的目的,如果函数可以返回整个表达式,也可以,这意味着:
foo(user.userId) // => returns string: "user.userId"
foo(user.name) // => returns string: "user.name"
答案 0 :(得分:1)
如果可以接受的话,一个选项并不完全是一个函数,而是一个包装器-您可以使用Proxy
来拦截属性访问并返回尝试访问的键:
function User() {}
const userProxy = new Proxy(
new User(),
{ get: (obj, prop) => prop }
);
console.log(userProxy.userId) // => returns string: "userId"
console.log(userProxy.name) // => returns string: "name"
答案 1 :(得分:1)
打字稿中没有nameof
运算符(例如C#)。有一个keyof
类型运算符,它允许您指定字符串必须是类型的键。因此我们可以将您的函数重写为:
class User {
userId: number;
name: string
}
function foo<T, K extends keyof T>(arg: T, key: K) {
return key
}
let user = new User();
foo(user, "userId") // => returns string: "userId"
foo(user, "name") // => returns string: "name"
foo(user, "namee") // error
注意:SO的其他用户David Sherret为nameof
实现了Typescript,您可以here找到它。我没有亲自尝试过,但是可能有用。