Вернуть доступное имя свойства (ключ) из объекта

Можно ли в 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 ответа

Здесь нет 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

Примечание есть nameof реализацию для Typescript сокамерника Дэвида Шеррета вы можете найти здесь. Я лично не пробовал это, но это может быть полезно.

Один из вариантов - это не функция, а обертка, если это приемлемо - вы можете использовать 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"

Другие вопросы по тегам