У меня есть такой класс ES6 в классическом пакете ES6 npm:
class Document {
/**
*
* @param {Object} options
* @param {String} [options.title]
* @param {String} [options.type]
* @param {String} [options.detail]
* @param {String} [options.instance]
* @param {Number} [options.status]
* @param {Extension} [extension]
*/
constructor (options, extension) { // some implementation ... }
}
Теперь я хочу предоставить некоторые типы TypeScript для этого класса.
Я пробовал это, но options
и extension
игнорируются, например. WebStorm или VS Code.
declare module "myModule" {
class Document implements IDocument {
constructor(options: IDocumentOptions, extension: IExtension)
detail: string;
extension: IExtension;
instance: string;
status: number;
title: string;
type: string;
}
interface IDocument {
title: string,
type: string,
detail?: string,
instance?: string,
status: number,
extension?: IExtension
}
interface IDocumentOptions {
title: string,
type: string,
detail?: string,
instance?: string,
status: number,
extension?: IExtension
}
interface IExtension {
}
const _: {
Document: Document
}
export = _;
}
};
«Игнорируется» означает, что они не предлагаются в качестве параметров для ctor при попытке создать экземпляр Document
. Более того, при предоставлении параметров ctor они помечаются как не ожидаемые. Я добавил интерфейсы IDocumentOptions
и IExtension
.
Я предполагаю, что вы пытаетесь перезаписать существующую переменную документа.
declare var Document: {
prototype: Document;
new(): Document;
};
Просто вам нужно переименовать свой класс и добавить реализацию конструктора, наконец, он должен работать
Я обновил свой вопрос, чтобы показать более подробную информацию (= объявление модуля). Использование declare var
приводит к ошибке TS1038: A 'declare' modifier cannot be used in an already ambient context.
.
Решил это:
type DocumentConstructor =
new (options: IDocumentOptions, extension: IExtension) => IDocument;
вместо
class Document implements IDocument {
constructor(options: IDocumentOptions, extension: IExtension)
detail: string;
extension: IExtension;
instance: string;
status: number;
title: string;
type: string;
}
Эм, так Document
это не конструктор, а вызываемая функция? Или вы имеете в виду type Document = new (options: IDocumentOptions, extension: IExtension) => IDocument;
? И вы можете использовать имя DocumentConstructor
вместо Document
. Если вы посмотрите на стандартная библиотека, это обычное соглашение для различения типов конструктора класса от типов экземпляра класса.
Что вы имеете в виду под "проигнорил"? Если вы компилируете с помощью компилятора командной строки, он там работает? Можете ли вы добавить свои определения
IDocumentOptions
иIExtension
?