Как расширить веб-компонент Shoelace в Typescript с помощью Lit

После расширения компонента <sl-кнопка> в Lit я не получаю ошибок Typescript для передачи неправильных атрибутов. Например, в приведенном ниже фрагменте кода, когда я вызываю <sl-button> с неправильным атрибутом, typescript показывает ошибки, но если я вызываю <my-button> с неправильным атрибутом, typescript не показывает никаких ошибок.

import SlButton from '@shoelace-style/shoelace/dist/components/button/button.js';
import {html} from 'lit';
import {customElement} from 'lit/decorators.js';

@customElement('my-button')
export default class MyButton extends SlButton {
  constructor() {
    super();
  }
}

export const Demo = () =>
  html`
    <my-button size = "not-exists">Click here!</my-button> // shows no error on "size"
    <sl-button size = "not-exists">Click here!</sl-button> // shows error on "size"
  `;

declare global {
  interface HTMLElementTagNameMap {
    'my-button': MyButton;
  }
}
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, это работает так, как ожидалось. Я считаю, что вы ищете не ошибку TypeScript, поскольку TS не заботятся об атрибутах HTML, а автодополнение кода для вашего редактора.

Я подозреваю, что вы используете Код VS с пользовательскими данными, предоставленный Shoelace. Это то, что сообщает VS Code о зарегистрированных элементах Shoelace, и если вы откроете dist/vscode.html-custom-data.json, вы увидите каждый тег и список доступных атрибутов.

Если вы расширяете и повторно помечаете элементы Shoelace, вам необходимо предоставить свои собственные данные для VS Code.


Пара замечаний:

Во-первых, когда вы импортируете components/button/button.js, вы по-прежнему регистрируете кнопку шнурка. На самом деле ваш код регистрирует и <sl-button>, и <my-button>, потому что регистрация происходит при импорте.

Во-вторых, компоненты Shoelace не предназначены для переименования. Многие полагаются на имена тегов, чтобы что-то работало, например <sl-menu>, который ожидает, что дети будут <sl-menu-item>, и <sl-tab-group>, который ожидает <sl-tab> и <sl-tab-panel> детей. Их переименование приведет к неожиданным поломкам.

Другие вопросы по теме