Вернуть доступное имя свойства (ключ) из объекта - PullRequest
0 голосов
/ 23 октября 2018

Возможно ли в 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 голосов
/ 23 октября 2018

В машинописи нет оператора 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 от другого пользователя SO, Дэвида Шеррета, вы можете найти ее здесь ,Я лично не пробовал это, но это может быть полезно.

0 голосов
/ 23 октября 2018

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