我正在尝试为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
分配给ParserFunc
类型的变量,则tsc不会发出警告。为了说明,请考虑以下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,所以请保持温和。谢谢! : - )
答案 0 :(得分: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 website上提出错误。