2016-02-11 6 views
1

Этот вопрос является вопросом, связанным с Why is typescript failing to import a module?, о котором я просил вчера. Начальная настройка такая же.Почему машинописный шрифт жалуется, когда ссылка /// после «use strict»?

У меня есть простой машинопись файл так:

/// <reference path="./typings/js-yaml/js-yaml.d.ts"/> 
'use strict'; 
import * as y from 'js-yaml'; 
console.log(y); 

Когда я компилирую, как так tsc --module commonjs file.ts, машинопись счастлив.

Но, когда я двигаю /// ссылку ниже «использовать строгий», как это:

'use strict'; 
/// <reference path="./typings/js-yaml/js-yaml.d.ts"/> 
import * as y from 'js-yaml'; 
console.log(y); 

Машинопись не устраивает:

$ tsc --module commonjs file.ts 
file.ts(4,20): error TS2307: Cannot find module 'js-yaml'. 

Машинопись делает действительно выходной файл скомпилированного и это то же самое, что и исходный результат, за исключением того, что ссылка /// после «использования строгого» во втором случае.

Что здесь происходит?

ответ

4

От MSDN,

Следующие правила применяются к опорному директивы. Ссылка на комментарий XML должна быть объявлена ​​перед любым скриптом.

Возможно, это и есть причина.

+0

Это часть его, возможно. Но это похоже на javascript в VisualStudio. Это не ссылка на машинопись. –

1

Существует примечание о <reference> тег в машинописном specification:

Комментарий формы /// <reference path="…"/>, что происходит перед первым знаком в исходном файле добавляет зависимость от исходного файла указанного в пути аргумент. Путь разрешен относительно каталога содержащего исходного файла.

1

Справочные директивы должны быть в верхней части файла. Когда они не на вершине, их игнорируют. Это приводит к сбою разрешения модуля, поскольку в противном случае компилятор не имеет понятия, чтобы искать в какой-либо другой случайной папке для определения модуля js-yaml.

Причина ограничения - это просто производительность: на самом деле это очень медленно (мы пытались!) Попытаться разобрать каждый комментарий в файле, чтобы узнать, является ли эта ссылка директивой или нет.

+0

Это имеет смысл. Было бы неплохо, если бы это было упомянуто более подробно в справочнике. Я даже не подумал пойти и прочитать спецификацию. Я могу сделать PR для этого, если руководство находится на github. –