【问题标题】:Missing TSC warning for invalid assignment无效分配缺少 TSC 警告
【发布时间】:2013-02-23 17:48:09
【问题描述】:

我正在尝试为 node-serialport 库编写 TypeScript 类型定义文件。该库导出具有两个函数rawreadlineparsers 变量。后者不能直接用作解析器 - 它在调用时会生成解析器。这是我第一次尝试类型定义文件的片段:

/// <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!如果我通过删除? 使readlinedelimiter 参数成为必需,我得到:

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) =&gt; serialport.ParserFunc 而不是 serialport.ParserFunc 所以应该出错。

标签: typescript tsc


【解决方案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 上提出错误。

【讨论】:

  • 是的,这是一个错误。我已经向团队提出了这个问题,但如果您想跟踪问题,请随时记录 CodePlex 错误。谢谢!
  • 谢谢,我会提交错误报告!
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2020-12-04
  • 2013-05-16
相关资源
最近更新 更多