Solid与TypeScript #

一、TypeScript 配置 #

1.1 tsconfig.json #

json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "jsx": "preserve",
    "jsxImportSource": "solid-js",
    "types": ["vite/client"],
    "noEmit": true,
    "isolatedModules": true,
    "strict": true
  },
  "include": ["src"]
}

二、组件类型 #

2.1 Props 类型定义 #

tsx
interface ButtonProps {
  variant?: 'primary' | 'secondary' | 'danger';
  size?: 'small' | 'medium' | 'large';
  disabled?: boolean;
  onClick?: () => void;
  children: JSX.Element;
}

function Button(props: ButtonProps): JSX.Element {
  return (
    <button
      class={`btn btn-${props.variant || 'primary'}`}
      disabled={props.disabled}
      onClick={props.onClick}
    >
      {props.children}
    </button>
  );
}

2.2 泛型组件 #

tsx
interface ListProps<T> {
  items: T[];
  renderItem: (item: T, index: number) => JSX.Element;
}

function List<T>(props: ListProps<T>): JSX.Element {
  return (
    <ul>
      <For each={props.items}>
        {(item, index) => props.renderItem(item, index())}
      </For>
    </ul>
  );
}

// 使用
<List
  items={users}
  renderItem={(user) => <li>{user.name}</li>}
/>

三、Signal 类型 #

3.1 基本类型 #

tsx
const [count, setCount] = createSignal<number>(0);
const [name, setName] = createSignal<string>('');
const [isActive, setIsActive] = createSignal<boolean>(false);

3.2 对象类型 #

tsx
interface User {
  id: number;
  name: string;
  email: string;
}

const [user, setUser] = createSignal<User | null>(null);

3.3 函数类型 #

tsx
type Setter<T> = (value: T | ((prev: T) => T)) => T;

const [value, setValue]: [() => number, Setter<number>] = createSignal(0);

四、事件类型 #

4.1 DOM 事件 #

tsx
function Form() {
  const handleSubmit = (e: Event & { currentTarget: HTMLFormElement }) => {
    e.preventDefault();
  };

  const handleInput = (e: InputEvent & { currentTarget: HTMLInputElement }) => {
    console.log(e.currentTarget.value);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input onInput={handleInput} />
    </form>
  );
}

五、最佳实践 #

  1. 为所有 Props 定义类型
  2. 使用泛型提高组件复用性
  3. 严格模式开启
  4. 避免使用 any
  5. 使用类型推断
最后更新:2026-03-28