Мне нужна в typescript (или, по крайней мере, в javascript) функция, которую я могу вызывать/использовать как массив: myFunc[некоторый ввод]
Я знаю, что могу сделать что-то вроде:
interface IInputs {
"someInput1": someType,
"someInput2": someType,
}
interface someType {
// ...
}
var myFunc: IInputs;
Итак, я могу написать:
myFunc["someInput1"]
Первая проблема заключается в том, что мне приходится жестко кодировать каждый возможный ввод. Ввод представляет собой строку, но может быть любой строкой. Другое дело, что моя функция должна вызывать другую («нормальную») просто так:
myFunc[input: string] : any {
//...
return anotherFunc(input);
}
Я упростил свою проблему, чтобы показать только соответствующие факты.
Каков ваш вопрос снова?
То, что вы предлагаете, не существует в JavaScript (или TypeScript). Это потому, что вы не может перегрузить оператор индекса [].
Это просто синтаксис: мне нужна функция. Но я не хочу использовать его как myFunc('bla'); но myFunc['bla']; вместо.
Итак, вы хотите получить доступ к значению объекта по его ключу? Если нет, то в чем смысл?
Вы хотите сказать нам, что хотите изменить синтаксис языка только для того, чтобы он выглядел как другой язык? Что вы хотите все испортить не только для себя, но и для своей команды и любого будущего человека, которому придется иметь дело с вашим кодом?
@davmich Причина в том, что я хочу использовать это вместе с intellisense в редакторе Monaco. Там я могу написать что-то вроде someObj.myFunc['hello'].someProp, и, находясь внутри кавычек, ctrl+space откроет раскрывающийся список с возможными аргументами myFunc. Список для автодополнения я строю во время выполнения в зависимости от доступных опций в том или ином контексте. Но для того, чтобы это действительно работало, реальный код должен выглядеть так же, поэтому эта функция выглядит слишком странно. Если я поставлю нормальный синтаксис функции, IntelliSense не будет работать так, как я хочу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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