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>
);
}
五、最佳实践 #
- 为所有 Props 定义类型
- 使用泛型提高组件复用性
- 严格模式开启
- 避免使用 any
- 使用类型推断
最后更新:2026-03-28