2016-05-30 2 views
1

Ich überlege, TypeScript-Annotationen zu einem vorhandenen Projekt hinzuzufügen. Ich habe Probleme, eine externe Deklarationsdatei für ein sehr einfaches Beispiel bietet:Wie TypeScript-Annotation zu vorhandener globaler Funktion bereitgestellt wird

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 erwartet, dass dies funktioniert, aber ich bekomme den folgenden Fehler:

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

Es scheint zu denken, dass die Funktionsdefinition eine Überladung ist und nicht die Implementierung einer vorherigen Deklaration.

Was ist der richtige Weg, um der greet Funktion einen Typ hinzuzufügen?

Anforderung: die program.ts sollte einfaches JavaScript sein, z. B. frei von jeder Art von Anmerkungen.

Antwort

1

Dies wird von der Sprache nicht unterstützt oder erlaubt. Im Wesentlichen macht der Code ...

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

declare function greet(p: Person): void; 

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

So erhalten Sie diesen Fehler für die Definition einer Funktion und Ambient-Funktion mit dem gleichen Namen.

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

Es ist, dies zu tun:

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.

Das ist nicht möglich den Code in program.ts ohne Änderung. Eine Möglichkeit besteht darin, program.ts zu program.js zu ändern dann beschreiben program.js mit einer Deklarationsdatei für die Verwendung in anderen Dateien. Das würde nur bedeuten, dass andere Dateien, die program.js verwenden, davon profitieren könnten, den Typ und die Struktur dieser Datei zu kennen, aber es würde Sie nicht davon abhalten, Fehler in program.js zu machen.

Beachten Sie, dass der Hauptzweck von Definitionsdateien darin besteht, Typinformationen für den in .js Dateien gefundenen Code zu liefern - nicht .ts Dateien.

+0

Wenn ich 'program.js' beschreibe, ohne die Erweiterung auf' .ts' zu ändern, hört sich das nach der richtigen Vorgehensweise an, da ich versuche, eine vorhandene Codebasis zu erweitern. Schade, dass es keine volle Sicherheit gibt. Wie auch immer, tolle Antwort! – btx9000

Verwandte Themen