Функция, подобная массиву javascript (индексатор javascript, подобный C#)

Мне нужна в typescript (или, по крайней мере, в javascript) функция, которую я могу вызывать/использовать как массив: myFunc[некоторый ввод]

Я знаю, что могу сделать что-то вроде:

interface IInputs {
    "someInput1": someType,
    "someInput2": someType,
}
interface someType {
    // ...
}
var myFunc: IInputs;

Итак, я могу написать:

myFunc["someInput1"]

Первая проблема заключается в том, что мне приходится жестко кодировать каждый возможный ввод. Ввод представляет собой строку, но может быть любой строкой. Другое дело, что моя функция должна вызывать другую («нормальную») просто так:

myFunc[input: string] : any {
    //...
    return anotherFunc(input);
}

Я упростил свою проблему, чтобы показать только соответствующие факты.

что вы имеете в виду под массив как и при чем здесь функция?

Nina Scholz 10.04.2019 17:02

Каков ваш вопрос снова?

Isaac Vidrine 10.04.2019 17:06

То, что вы предлагаете, не существует в JavaScript (или TypeScript). Это потому, что вы не может перегрузить оператор индекса [].

Tim Klein 10.04.2019 17:06

Это просто синтаксис: мне нужна функция. Но я не хочу использовать его как myFunc('bla'); но myFunc['bla']; вместо.

Gigi 10.04.2019 17:07

Итак, вы хотите получить доступ к значению объекта по его ключу? Если нет, то в чем смысл?

Isaac Vidrine 10.04.2019 17:12
Почему вы хотите изменить синтаксис с вызова метода на доступ к массиву? Какую пользу это вам дает?
user47589 10.04.2019 17:18

Вы хотите сказать нам, что хотите изменить синтаксис языка только для того, чтобы он выглядел как другой язык? Что вы хотите все испортить не только для себя, но и для своей команды и любого будущего человека, которому придется иметь дело с вашим кодом?

user7143559 10.04.2019 18:44

@davmich Причина в том, что я хочу использовать это вместе с intellisense в редакторе Monaco. Там я могу написать что-то вроде someObj.myFunc['hello'].someProp, и, находясь внутри кавычек, ctrl+space откроет раскрывающийся список с возможными аргументами myFunc. Список для автодополнения я строю во время выполнения в зависимости от доступных опций в том или ином контексте. Но для того, чтобы это действительно работало, реальный код должен выглядеть так же, поэтому эта функция выглядит слишком странно. Если я поставлю нормальный синтаксис функции, IntelliSense не будет работать так, как я хочу.

Gigi 10.04.2019 19:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
8
134
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы ищете Прокси:

function someOtherFunc(prop: string) {
    return "you said " + prop;
}

interface Indexable {
    [key: string]: any;
}


let myFunc: Indexable = new Proxy({}, {
    get(_, prop: string) {
        return someOtherFunc(prop);
    }
});


console.info(myFunc['hello'])
console.info(myFunc['hey'])

JS-версия:

    function someOtherFunc(prop) {
        return "you said " + prop;
    }
    
    let myFunc = new Proxy({}, {
        get(_, prop) {
            return someOtherFunc(prop);
        }
    });
    
    
    console.info(myFunc['hello'])
    console.info(myFunc['hey'])

Хотя это правильный ответ, было бы предпочтительно, чтобы никто серьезно не отвечал на вопрос @Gigi, когда указанный человек явно не знает, что делает. Сообщать ему о функциях, которые ему не нужно знать и использовать, — это прямой путь к катастрофе.

user7143559 10.04.2019 17:44

@davmich Причина в том, что я хочу использовать это вместе с intellisense в редакторе Monaco. Там я могу написать что-то вроде someObj.myFunc['hello'].someProp, и, находясь внутри кавычек, ctrl+space откроет раскрывающийся список с возможными аргументами myFunc. Список для автодополнения я строю во время выполнения в зависимости от доступных опций в том или ином контексте. Но для того, чтобы это действительно работало, реальный код должен выглядеть так же, поэтому эта функция выглядит слишком странно. Если я поставлю нормальный синтаксис функции, IntelliSense не будет работать так, как я хочу.

Gigi 10.04.2019 19:32

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