1. 模块划分
- 组件模块:
- 原子组件:负责呈现最基础的UI元素,如按钮、输入框等。这些组件应该是高度可复用的,只关心自身的样式和交互,不涉及复杂的业务逻辑。例如,创建一个
Button.svelte
组件,接受 text
、onClick
等属性,并且使用TypeScript定义其属性类型。
// Button.svelte
import type { SvelteComponentTyped } from'svelte';
type ButtonProps = {
text: string;
onClick: () => void;
};
export default class Button extends SvelteComponentTyped<ButtonProps> {}
- 分子组件:由原子组件组合而成,用于实现一些相对简单的功能模块,如表单组、导航栏等。这些组件会处理一些与自身相关的交互逻辑,但不涉及全局状态。例如,
FormGroup.svelte
组件,它可能包含多个输入框原子组件,并处理表单内的验证逻辑。
- 页面组件:负责整个页面的布局和交互逻辑,会整合分子组件,并处理与页面相关的业务逻辑和状态。例如,
HomePage.svelte
组件,它会引入各种分子组件,并处理页面级别的数据获取和用户交互。
- 服务模块:
- API服务:专门负责与后端API进行交互。创建一个
api.ts
文件,使用 fetch
或者 axios
等库来发送请求,并使用TypeScript定义请求和响应的数据类型。例如:
// api.ts
import type { User } from './types';
const BASE_URL = 'https://your-backend-api.com/api';
export const fetchUser = async (id: number): Promise<User> => {
const response = await fetch(`${BASE_URL}/users/${id}`);
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
};
- 状态管理服务:使用Svelte的
writable
、derived
等函数来管理应用的状态。例如,创建一个 userStore.ts
文件来管理用户相关的状态:
// userStore.ts
import { writable } from'svelte/store';
import type { User } from './types';
const userStore = writable<User | null>(null);
export const setUser = (user: User) => {
userStore.set(user);
};
export const getUser = () => userStore;
- 类型定义模块:创建一个
types.ts
文件,集中定义整个应用中用到的所有数据类型,包括API请求和响应的数据类型、组件属性类型等,以确保类型安全和一致性。
2. 处理API请求与响应的数据类型安全
- 请求类型:在API服务模块中,为每个API请求函数定义明确的输入参数类型。例如,上述
fetchUser
函数的 id
参数定义为 number
类型。如果请求体包含复杂数据结构,同样要使用TypeScript类型定义。比如,假设要创建一个用户的API:
type CreateUserRequest = {
name: string;
email: string;
password: string;
};
export const createUser = async (data: CreateUserRequest): Promise<void> => {
const response = await fetch(`${BASE_URL}/users`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
if (!response.ok) {
throw new Error('Failed to create user');
}
};
- 响应类型:为API响应数据定义类型。通过
Promise
的返回类型来确保响应数据符合预期类型。如 fetchUser
函数返回 Promise<User>
,其中 User
类型在 types.ts
中定义:
// types.ts
type User = {
id: number;
name: string;
email: string;
};
3. 利用Svelte和TypeScript的特性实现可维护、可扩展的代码结构