我试图为node-serialport库编写TypeScript类型定义文件。该库导出parsers
变量具有两个功能,raw
和readline
。后者不能直接用作解析器 - 它在调用时会生成解析器。这是在类型定义文件我第一次尝试的片段:无效分配丢失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.readline
到ParserFunc
类型的变量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,所以请温柔。谢谢! :-)
由于您声明了ParserFunc类型的两个属性,赋值不会导致错误。然而,第二个声明(readline)实际上意味着:“我有一个函数,它有一个可选的字符串作为输入,它会返回一些类型为ParserFunc的” – thomaux 2013-03-08 10:27:21
@Anzeo“sp.parsers.readline”的类型是'(分隔符?:string)=> serialport.ParserFunc'不是'serialport.ParserFunc'所以它应该错误。 – Fenton 2013-03-08 10:31:45