Я пытаюсь написать файл определения типа TypeScript для библиотеки node-serialport. Библиотека экспортирует переменную parsers
с двумя функциями: raw
и readline
. Последний не может использоваться как парсер напрямую - он производит парсер при вызове. Это фрагмент моей первой попытки создать файл определения типа:
/// <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;
}
Проблема, с которой я столкнулся, заключается в том, что tsc не предупреждает, если я назначу parsers.readline
переменной типа ParserFunc
. Для иллюстрации рассмотрим следующий файл 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
! Если я сделаю параметр 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 вообще, так что будьте осторожны. Спасибо! :-)
sp.parsers.readline
(delimiter?: string) => serialport.ParserFunc
, а неserialport.ParserFunc
, поэтому он должен быть ошибочным. - person Fenton   schedule 08.03.2013