Насколько я понимаю, нет способа сделать это без утверждений типа. Документы для гибридных типов также используют его таким образом, например
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
Вы могли использовать алгоритм для определения строкового подобия и затем предложить другую строку от Вашего поискового индекса до определенного различия.
Один из этих алгоритмов является расстоянием Левенштейна.
Однако не забывайте искать существующие решения. Я думаю, например, Lucene имеет возможность искать подобные строки.
Btw, вот связанное сообщение по этой теме: Как алгоритм Google “Did you mean?” работает?
Это сделано, запросив через регулярное выражение самые близкие ключевые слова, которые соответствуют фразе.
Вот большая статья, которая могла бы помочь Вам.
С T-SQL можно использовать SOUNDEX
функция для сравнения слов фонетически.
Если Вы берете пользовательский вход и затем сравниваете его с другими словами в Вашей базе данных кодом soundex, необходимо ли смочь придумать список 'Вас, означают'? слова.
Например.
select SOUNDEX('andrew')
select SOUNDEX('androo')
оба произведет тот же вывод (A536).
В эти дни существуют лучшие алгоритмы, но soundex встроен в SQL-сервер.
Самый простой подход, о котором я могу думать, должен записать функцию, которая возвращает степень несоответствия между двумя словами, и Вы циклично выполняетесь через все слова и находите лучшие.
Я сделал это с методом ветвей и границ. Позвольте мне вскопать код:
bool matchWithinBound(char* a, char* b, int bound){
// skip over matching characters
while(*a && *b && *a == *b){a++; b++;}
if (*a==0 && *b==0) return true;
// if bound too low, quit
if (bound <= 0) return false;
// try assuming a has an extra character
if (*a && matchWithinBound(a+1, b, bound-1)) return true;
// try assuming a had a letter deleted
if (*b && matchWithinBound(a, b+1, bound-1)) return true;
// try assuming a had a letter replaced
if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
// try assuming a had two adjacent letters swapped
if (a[0] && a[1]){
char temp;
int success;
temp = a[0]; a[0] = a[1]; a[1] = temp;
success = matchWithinBounds(a, b, bound-1);
temp = a[0]; a[0] = a[1]; a[1] = temp;
if (success) return true;
}
// can try other modifications
return false;
}
int DistanceBetweenWords(char* a, char* b){
int bound = 0;
for (bound = 0; bound < 10; bound++){
if (matchWithinBounds(a, b, bound)) return bound;
}
return 1000;
}