4

node-serialportライブラリの TypeScript 型定義ファイルを作成しようとしています。ライブラリは、2 つの関数を含むparsers変数をエクスポートします。後者は、パーサーとして直接使用することはできません。呼び出されるとパーサーが生成されます。これは、型定義ファイルでの私の最初の試みの断片です。rawreadline

/// <reference path="./node.d.ts" />
declare module "serialport" {

    import events = module("events");
    export interface ParserFunc {
        (eventEmitter: events.NodeEventEmitter, buffer: NodeBuffer): void;
    }

    interface Parsers {
        raw: ParserFunc;
        readline(delimiter?: string): ParserFunc;
    }

    export var parsers: Parsers;
}

parsers.readline私が直面している問題は、タイプの変数に割り当てた場合に tsc が警告しないことですParserFunc。説明のために、次の TypeScript ファイルを考えてみましょう。

import sp = module("serialport");

var a: number = sp.parsers.raw; // not ok
var b: number = sp.parsers.readline; // not ok
var c: sp.ParserFunc = sp.parsers.raw; // ok!
var d: sp.ParserFunc = sp.parsers.readline; // not ok

tsc を使用してこのファイルをコンパイル/トランスパイルすると、次のようになります。

test1.ts(3,16): Cannot convert 'sp.ParserFunc' to 'number'
test1.ts(4,16): Cannot convert '(delimiter?: string) => sp.ParserFunc' to 'number'

しかし、への割り当てに対する警告はありませんd! を削除して必須のdelimiterパラメーターを作成すると、次のようになります。readline?

test1.ts(3,16): Cannot convert 'sp.ParserFunc' to 'number'
test1.ts(4,16): Cannot convert '(delimiter: string) => sp.ParserFunc' to 'number'
test1.ts(6,23): Cannot convert '(delimiter: string) => sp.ParserFunc' to 'sp.ParserFunc': Call signatures of types '(delimiter: string) => ParserFunc' and 'ParserFunc' are incompatible:
    Type 'String' is missing property 'addListener' from type 'NodeEventEmitter'

したがって、割り当てdが無効であることを検出しました。しかし、なぜ前にしないのですか?

TypeScript との出会いはこれが初めてなので、お手柔らかにお願いします。ありがとう!:-)

4

1 に答える 1

1

これは私にはバグのように見えます。コンパイラは、そうでないときに関数を呼び出していると想定しているようです。

簡単な例でこれを再現できます。

declare module serialport {

    export interface ParserFunc {
        (eventEmitter: number, buffer: string): void;
    }

    interface Parsers {
        raw: ParserFunc;
        readline(delimiter?: string): ParserFunc;
    }

    export var parsers: Parsers;
}

var c: serialport.ParserFunc = serialport.parsers.raw; // ok!
var d: serialport.ParserFunc = serialport.parsers.readline; // not ok

したがって、readline が実際に呼び出された場合、これは有効ですが、実際には readline は呼び出されずに渡されているため、エラーが表示されるはずです。

TypeScript Codeplex Web サイトでバグを報告できます。

于 2013-03-08T10:30:37.333 に答える