【问题标题】:Return accessed property name (key) from object从对象返回访问的属性名称(键)
【发布时间】:2018-10-22 22:08:28
【问题描述】:

是否可以在 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"

【问题讨论】:

标签: javascript typescript class-members


【解决方案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"

【讨论】:

    【解决方案2】:

    打字稿中没有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 为 Typescript 提供了一个 nameof 实现,您可以在 here 找到它。我没有亲自尝试过,但它可能有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多