typescript - 缺少无效分配的 TSC 警告

标签 typescript tsc

我正在尝试为 node-serialport 编写一个 TypeScript 类型定义文件图书馆。该库导出一个 parsers 变量,其中包含两个函数,rawreadline。后者不能直接用作解析器 - 它在调用时生成解析器。这是我第一次尝试类型定义文件的片段:

/// <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,所以请保持温和。谢谢! :-)

最佳答案

这对我来说确实像是一个错误。看起来编译器假定您正在调用该函数,而实际上您并未调用该函数。

我可以用简化的例子重新创建这个:

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 上提出错误.

关于typescript - 缺少无效分配的 TSC 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15289663/

相关文章:

typescript - 发出的 .d.ts 文件中的返回类型是 any 而不是 this

javascript - 如何使用 TypeScript 在 VS Code 中查找模块 "fs"?

angular - 选择对象数组内的嵌套对象数组

javascript - 如何对 TypeScript 类执行 Joi 验证?

reactjs - useMemo 返回类型错误,但 tsc 不会显示错误?

typescript - 为什么 tsc 不在 Heroku 中运行?

intel - 从 KVM 中的 guest vm 用户空间拦截 rdtsc 指令

node.js - 类型检查字符串而不是使用 instanceof

angular - 如何在 vscode 中使用一个(或两个)快捷方式在 TypeScript 和 HTML 之间切换?

ios - iOS 上的 Ionic v4 状态栏文本没有改变