2016-05-30 7 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; 

私を、私は非常に単純な例のために外部宣言ファイルを提供するトラブルを抱えている これはうまくいくと思っていましたが、次のエラーが表示されます:

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にコードを変更することなく可能ではありませんが。 1つの可能性は変更することですprogram.ts to program.js次に、program.jsと他のファイルで使用するための宣言ファイルを記述します。これは、program.jsを使用している他のファイルが、そのファイルのタイプと構造を知っていることから利益を得ることができますが、program.jsで間違いを防ぐことはできません。

定義ファイルの主な目的は、.jsファイルにあるコードのタイプ情報を提供することです(.tsファイルではありません)。

+0

拡張子 '.ts 'を変更せずに' program.js'を記述することは、既存のコードベースを拡張しようとしていることを考えると正しいことです。あまりにも完全な型の安全性が悪いです。とにかく、素晴らしい答え! – btx9000

関連する問題