2016-05-30 3 views
1

Я рассматриваю возможность добавления аннотаций типа TypeScript к существующему проекту. У меня возникли проблемы обеспечения внешнего файла декларации на очень простом примере:Как предоставить аннотацию TypeScript существующей глобальной функции

program.ts:

/// <reference path="types.d.ts"/> 

function greet (p) { 
    console.log(p.name); 
} 

var x = {name: 'Mary'}; 

greet(x); 

types.d.ts:

interface Person { 
    height?: number, 
    name: string 
} 

declare function greet (p: Person): void; 

I ожидал, что это сработает, но я получаю следующую ошибку:

program.ts(3,10): error TS2384: Overload signatures must all be ambient or non-ambient.

Кажется, что определение функции является перегрузкой, а не реализацией предыдущей декларации.

Каков правильный способ добавить тип к функции greet?

Требование:program.ts должно быть простым JavaScript, например, без аннотаций любого типа.

ответ

1

Это не поддерживается или не разрешено языком. По существу код делает ...

interface Person { 
    height?: number, 
    name: string 
} 

declare function greet(p: Person): void; 

function greet(p: any): void { 
    console.log(p.name); 
} 

Таким образом, вы получаете эту ошибку для определения функции и функции окружающего пространства с тем же именем.

What is the right way to add a type to the greet function?

Это сделать это:

interface Person { 
    height?: number, 
    name: string 
} 

function greet(p: Person): void { 
    console.log(p.name); 
} 

Requirement: the program.ts should be plain JavaScript, e.g., free from any type annotations.

Это невозможно без изменения кода в program.ts. Одна из возможных - изменить program.ts на номер program.js затем написать program.js с файлом объявления для использования в других местах. Это означало бы, что другие файлы, использующие program.js, могут извлечь выгоду из знания типа и структуры этого файла, но это не помешает вам совершить ошибки в program.js.

Обратите внимание, что основная цель файлов определений - предоставить информацию о типе для кода, найденного в .js файлах, а не .ts файлах.

+0

Описание 'program.js' без изменения расширения на' .ts' действительно звучит как правильная вещь, потому что я пытаюсь расширить существующую базу кода. Слишком плохо, тогда нет полной безопасности. В любом случае, отличный ответ! – btx9000

Смежные вопросы