Вернуть доступное имя свойства (ключ) из объекта
Можно ли в 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"