Я по-прежнему новичок в TypeScript и часто нахожу вещи, которые я нахожу очень странными.Успех выбора типа зависит от наименования значения
Возьмите этот код:
interface MyInterface<T> {
[i: string]: T;
}
function myFunc<T>(arg: MyInterface<T>) { }
var o = { 'val1': 42, 'val2': 43 };
myFunc(o);
вызов завершается с жалобой о том, что «Индекс подписи не хватает».
Интересно, что это не хватает, когда я пишу
myFunc({ 'val1': 42, 'val2': 43 });
Это означало бы, что выражение { 'val1': 42, 'val2': 43 }
«s тип выводится в обратном направлении от вызова (который несколько прогнозное), но не так, когда связаны с именем (что странно, а не как, например, я знаю обратный вывод для работы с F #).
Но это становится еще страннее.
Если изменить интерфейс к
interface MyInterface<T> {
[i: number]: T;
}
то соответствующий
var o = [42, 43];
myFunc(o);
также работает (в дополнение к прохождению массива напрямую).
Это что, дизайн? Какие правила объясняют это?
Но ясно, улучшение только в отношении индекса конкретно и там все еще есть разница между объявленным типом и контекстуальным типом, правильно? Я думаю, что в F # такого различия нет. – John
Правильно - способ вывода типов не использует системы унификации, которые вы найдете на таких языках, как F #. Преимущество этой местности заключается в том, что легче рассуждать о том, как язык вводит тип-вывод, ограничивается уровнем оператора (хотя помните, что каждый оператор может содержать несколько операторов через выражения функций и т. П.). –