Búsqueda de sitios web

typescript - Falta advertencia de TSC para asignación inválida


Estoy tratando de escribir un archivo de definición de tipos TypeScript para la biblioteca node-serialport. La biblioteca exporta una variable parsers con dos funciones, raw y readline. Esta última no puede usarse directamente como un parser: produce un parser cuando se invoca. Este es un fragmento de mi primer intento de un archivo de definición de tipos:

/// <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;
}

El problema con el que me encuentro es que tsc no advierte si asigno parsers.readline a una variable del tipo ParserFunc. Para ilustrar, considera el siguiente archivo 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

Cuando compilo/transpilo este archivo usando tsc, obtengo:

test1.ts(3,16): Cannot convert 'sp.ParserFunc' to 'number'
test1.ts(4,16): Cannot convert '(delimiter?: string) => sp.ParserFunc' to 'number'

¡Pero ninguna advertencia por la asignación a d! Si hago que el parámetro delimiter de readline sea obligatorio eliminando el ?, obtengo:

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'

Así que AHORA detecta que la asignación a d es inválida. Pero ¿por qué no antes?

Este es mi primer encuentro con TypeScript en absoluto, así que por favor sean amables. ¡Gracias! :-)

Respuesta #1

Esto me parece un error. Parece que el compilador ha asumido que estás llamando a la función cuando no lo estás haciendo.

Puedo recrear esto con el ejemplo simplificado:

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

Así que si readline realmente se llamara, esto sería válido, pero en realidad readline se está pasando sin ser llamado, por lo que debería mostrar un error.

Puedes reportar errores en el sitio web de TypeScript Codeplex.

Artículos relacionados