Я пишу простой класс и объявление для него. Затем я использую jsdoc, чтобы указать тип библиотеки.
// index.ts
class VjsccXX {
el: HTMLElement
text: string
show: boolean
constructor(el: HTMLElement, text: string, show = true) {
this.el = el
this.text = text
this.show = show
this.el.classList.add('vjsscc-xx')
if (!show) {
this.el.style.display = 'none'
}
console.info('xx is ready')
}
hide() {
this.el.style.display = 'none'
}
tex() {
this.el.innerHTML = this.text
}
}
export default VjsccXX
// index.d.ts
declare class VjsccXX {
el: HTMLElement
text: string
show: boolean
hide(): void
tex(): void
constructor(el: HTMLElement, text: string, show?: boolean)
}
export = VjsccXX
// test.js
/** @type {import('..')} */
const VjsccXX = window.VjsccXX
Но, как показано на фото выше, VjsccXX
становится экземпляром, а не классом. Итак, как с этим бороться?
======================= Некоторые обновления ========================= знак равно
Изображение, показанное выше, использует window.VjsccXX
, потому что его html-файл включает пакет umd. И его тип неправильный, потому что VjsccXX
должен быть конструктором класса, а не экземпляром класса, который имеет свойства прототипа.
Затем я пишу еще один файл ts, чтобы увидеть его тип:
Может быть, я мог бы написать так?
======================= Еще одно обновление ========================= ===
Также работайте с cjs
:
Может быть, это проблема jsdoc?
Потому что после сборки umd
VjsccXX
будет добавлен к window
. И я объявляю, что новая переменная с тем же именем не конфликтует. Затем я использую jsdoc, чтобы указать его тип, чтобы получить правильный тип. И его тип неправильный, VjsccXX
должен быть конструктором, а не экземпляром, который имеет свойства в прототипе класса.
Я думаю, вам нужно использовать typeof
здесь:
// test.js
/** @type {typeof import('..')} */
const VjsccXX = window.VjsccXX
Да, это то, чего я хочу. Большое спасибо!!
Что вы ожидаете получить? Вы создаете переменную с тем же именем, что и определение вашего класса, и указываете с помощью
@type
, что она имеет тип вашего класса. Кажется, здесь все работает так, как ожидалось.