Как аннотировать компонент SolidJS с помощью Typescript?

Я начал изучать машинописный текст вместе с SolidJS и столкнулся с этим.

import { Component } from "solid-js"

const Button:Component=({onClick})=>{

    return <button onClick = {onClick}>Button</button>
    
}

export default Button

Каждый созданный мной компонент изобилует ошибками, но проект работает нормально, даже функции, переданные в onClick.

Вероятная неправильная конфигурация vscode? Я кодирую в React обычно.

Расширение файла tsx:

tsconfig.json

{
  "compilerOptions": {
    "strict": true,
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "jsx": "preserve",
    "jsxImportSource": "solid-js",
    "types": ["vite/client"],
    "noEmit": true,
    "isolatedModules": true,
    "paths": {
      "@": ["./src"],
      "@/*": ["./src/*"],
      "$lib":["./src/lib"],
      "$lib/*":["./src/lib/*"]
    }
  }
}

репозиторий solidjs

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Component используется для аннотирования компонента SolidJS. Это общий объект Props.

Давайте посмотрим его определение:

/**
 * A general `Component` has no implicit `children` prop.  If desired, you can
 * specify one as in `Component<{name: String, children: JSX.Element>}`.
 */
export declare type Component<P = {}> = (props: P) => JSX.Element;

Так как ваш компонент имеет только один реквизит, onClick, и он принимает событие клика в качестве единственного параметра. Событие клика имеет тип MouseEvent:

import { Component } from "solid-js"

interface ButtonProps {
  onClick: (event: MouseEvent) => void
}

const Button: Component<ButtonProps> =({ onClick })=>{
  return (
    <button onClick = {onClick}>Button</button>
  );
}

export default Button;

Каждый созданный мной компонент изобилует ошибками, но проект работает нормально, даже функции, переданные в onClick.

Typescript — это вспомогательный инструмент, компоненты работают до тех пор, пока они компилируются в JavaScript без ошибок.

Если вы не укажете свой собственный тип реквизита для Component, реквизит будет простым объектом, потому что по умолчанию он равен P = {}.

Вы получаете ошибку, потому что ваш компонент кнопки ожидает {} в качестве своей опоры, но вы передаете { onClick: (event: MouseEvent) => void }.

Вероятная неправильная конфигурация vscode? Я кодирую в React обычно.

Вероятно, это не имеет ничего общего с vscode, так как он имеет встроенную поддержку машинописного текста, а это означает, что вам не нужно какое-либо расширение для использования машинописного текста, если оно установлено в вашем package.json и имеет tsconfig.json.

Сигнатура типа компонента Solid отличается от сигнатуры React. С точки зрения React Solid имеет только функциональные компоненты и не передает состояние своим дочерним элементам, поэтому в типе S = {} Solid нет Component.

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