2013-03-08 57 views
4

我试图为node-serialport库编写TypeScript类型定义文件。该库导出parsers变量具有两个功能,rawreadline。后者不能直接用作解析器 - 它在调用时会生成解析器。这是在类型定义文件我第一次尝试的片段:无效分配丢失TSC警告

/// <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.readlineParserFunc类型的变量TSC不会警告。为了说明这一点,考虑下面的打字稿文件:

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编译/ transpile这个文件,我得到:

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,所以请温柔。谢谢! :-)

+0

由于您声明了ParserFunc类型的两个属性,赋值不会导致错误。然而,第二个声明(readline)实际上意味着:“我有一个函数,它有一个可选的字符串作为输入,它会返回一些类型为ParserFunc的” – thomaux 2013-03-08 10:27:21

+1

@Anzeo“sp.parsers.readline”的类型是'(分隔符?:string)=> serialport.ParserFunc'不是'serialport.ParserFunc'所以它应该错误。 – Fenton 2013-03-08 10:31:45

回答

1

这看起来像是一个bug。它看起来像编译器认为你不在时调用该函数。

我可以用简化的例子创建此:

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 website上引发错误。

+1

是的,这是一个错误。我已经向团队提出了这个问题,但如果你想跟踪这个问题,可以随时登录CodePlex的bug。谢谢! – 2013-03-08 15:51:33

+0

谢谢,我将提交一份错误报告! – provegard 2013-03-08 18:12:32