【发布时间】:2013-02-23 17:48:09
【问题描述】:
我正在尝试为 node-serialport 库编写 TypeScript 类型定义文件。该库导出具有两个函数raw 和readline 的parsers 变量。后者不能直接用作解析器 - 它在调用时会生成解析器。这是我第一次尝试类型定义文件的片段:
/// <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!如果我通过删除? 使readline 的delimiter 参数成为必需,我得到:
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,所以请温柔一点。谢谢! :-)
【问题讨论】:
-
赋值不会导致错误,因为您声明了 ParserFunc 类型的两个属性。然而,第二个声明(readline)实际上意味着:“我有一个函数,它有一个可选的字符串作为输入,它会返回一些 ParserFunc 类型的东西”
-
@Anzeo
sp.parsers.readline的类型是(delimiter?: string) => serialport.ParserFunc而不是serialport.ParserFunc所以应该出错。
标签: typescript tsc