从对象返回访问的属性名称(键)

时间:2018-10-22 22:08:28

标签: javascript typescript class-members

在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"

2 个答案:

答案 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找到它。我没有亲自尝试过,但是可能有用。