4

我正在尝试为node-serialport库编写一个 TypeScript 类型定义文件。该库导出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,所以请温柔一点。谢谢!:-)

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 网站上提出错误。

于 2013-03-08T10:30:37.333 回答