Возможно, вопрос уже задавался, но я не смог найти ни одного. И это кажется таким наивным. TypeScript хорошо сочетается с литеральной нотацией объекта, но при определении методов внутри, чем он не может должным образом обработать this контекст внутри этих функций, кажется, что this получает тип any, поэтому есть нет автозаполнения.

var foo = {
    log(str) {
        console.log(str);
    },
    print(str) {
        this. /* No autocompletion */
    }
};    
foo. /* Normal autocompletion */

Детская площадка

Естественно, я ожидал бы, что автозаполнение правильно работает в методе, так же, как при использовании переменной foo. Я мог бы сначала объявить класс, а затем создать экземпляр объекта, но почему он не работает без объявления промежуточного class или interface, в этом простом случае это похоже на шаблон?

0
tenbits 28 Май 2017 в 20:34

2 ответа

Лучший ответ

Согласно официальной документации TypeScript о функциях:

[...] все еще any. Это потому, что this происходит из выражения функции внутри литерала объекта.

TypeScript Wiki на GitHub также содержит хорошие пояснения о { Ключевое слово {X0}} и его контекст.

1
mercador 28 Май 2017 в 18:18

Для дальнейшего использования: начиная с TS@2.3, это поведение немного сложнее:

  • Если метод явно объявил этот параметр, он имеет тип этого параметра.

  • В противном случае, если метод контекстно типизирован подписью с этот параметр, это имеет тип этого параметра.

  • В противном случае, если --noImplicitThis включен, и литерал содержащего объекта имеет контекстный тип, который включает ThisType, это имеет тип T.
  • В противном случае, если --noImplicitThis включен и литерал содержащего объекта имеет контекстный тип, который не включает ThisType, это имеет контекстный тип.
  • В противном случае, если --noImplicitThis включен, это имеет тип литерала содержащего объекта.
  • В противном случае это имеет тип любой.

ссылка

0
Krzysztof Grzybek 14 Янв 2019 в 17:28