Получить тип крачки, используя его имя
TL; Dr версия:
С помощью TernJS
для целей автозаполнения я хочу использовать правило для функции, которое принимает строку в качестве параметра, чтобы вернуть тип с именем, совпадающим с заданным параметром, например:
foo("TypeA") returns +TypeA
foo("TypeB") returns +TypeB
Проще говоря, я ищу, есть ли в Tern нотация, которая может дать вам тип, используя его имя.
Длинная версия:
С помощью CodeMirror
в комбинации с TernJS
установить в NodeJS
Я пытаюсь смоделировать поведение фабрики и предоставить аналогичные возможности в JavaScript в ES6:
//Module: Test.js
module.exports = (function() {
var test = {};
//....
test.classA = class ClassA {
constructor() {
//....
},
foo() {}
//....
}
test.factoryClass = class Factory {
constructor() {
//....
}
register(name, classData) {
//....
}
createInstance(name) {
//....
}
}
return test;
})();
Теперь я хочу сделать следующее: если я зарегистрировал ClassA, выполнив:
var test = require("Test");
var factory = new test.factoryClass();
factory.register("ClassA", classA);
И я создаю экземпляр класса этого:
var classAInst = factory.createInstance("ClassA");
Я хочу, чтобы в редакторе можно было получить методы ClassA
пример.
classAInst.<AutoCompletion-KeyStroke> //This should give the completion list containing `foo`.
Теперь я знаю, что для этого мне нужно сгенерировать правила механизма вывода TernJS в.json
определения, поэтому для ClassA и Factory у меня есть что-то вроде:
{
"Test" : {
"ClassA": {
"!type": "fn()"
"prototype": {
"foo": {
"!type": "fn() -> string"
}
}
}
//....
"Factory": {
"prototype": {
"register": {
"!type": "fn(className: string, classDefinition: object)"
},
"createInstance": {
"!type": "<This is what I need to specify properly>"
}
}
}
}
}
Проблема в том, что я выяснил, как формировать правила, проверяя ecma6.json
файл в репозитории TernJS, так как я не смог найти какую-либо документацию механизма вывода.
Я пытался сделать что-то вроде этого, пытаясь сказать движку таким образом индексировать тип, но это не работает (я полагаю, что []
используется только для определения массива):
"createInstance": {
"!type": "fn(name: string) -> Test[!0]"
}
Таким образом, любая помощь по этому вопросу будет оценена. Любая ссылка или ссылка на руководство по механизму логического вывода также будет очень полезна, поскольку мне не удалось найти такую информацию.