node-serialportライブラリの TypeScript 型定義ファイルを作成しようとしています。ライブラリは、2 つの関数を含むparsers
変数をエクスポートします。後者は、パーサーとして直接使用することはできません。呼び出されるとパーサーが生成されます。これは、型定義ファイルでの私の最初の試みの断片です。raw
readline
/// <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 との出会いはこれが初めてなので、お手柔らかにお願いします。ありがとう!:-)