面试题答案
一键面试1. 错误处理
- null 和 undefined:在TypeScript中,null和undefined都可以用来表示值的缺失。一般来说,undefined表示变量声明了但未赋值,而null更多是程序员主动设置为“空”的值。在错误处理场景下,如果一个函数可能因为某些原因无法返回有效的结果,可以返回null或undefined来表示这种情况。
function findUserById(id: number, users: { id: number }[]): { id: number } | null { for (let user of users) { if (user.id === id) { return user; } } return null; } const users = [{ id: 1 }, { id: 2 }]; const user = findUserById(3, users); if (user === null) { console.log('User not found'); } else { console.log('User found:', user); }
- never:never类型表示的是那些永不存在的值的类型。当一个函数抛出异常或永远不会返回时,其返回值类型是never。这在错误处理中很有用,比如一个处理错误的函数,它永远不会正常返回。
function throwError(message: string): never { throw new Error(message); } function doSomething(): string { if (Math.random() > 0.5) { return 'Success'; } else { return throwError('Operation failed'); } }
2. 模块间通信
- void:void类型通常用来表示没有任何返回值的函数。在模块间通信中,如果一个模块提供的函数只是执行某些操作,比如发送日志到远程服务器,而不需要返回具体值,那么可以使用void类型。
// logger.ts export function logMessage(message: string): void { console.log(`[LOG] ${message}`); // 这里可能还有发送日志到远程服务器等操作 } // main.ts import { logMessage } from './logger'; logMessage('Starting application');
- null 和 undefined:在模块间传递数据时,如果某个数据可能缺失,可以使用null或undefined来表示。例如,一个模块从另一个模块获取配置信息,而某些配置项可能是可选的。
// config.ts export const config = { apiUrl: 'http://example.com/api', // 假设这个密钥在测试环境可能不存在 apiSecret: process.env.NODE_ENV === 'production'? 'abc123' : undefined }; // api.ts import { config } from './config'; function makeApiCall() { if (config.apiSecret === undefined) { console.warn('API secret is missing, some operations may be limited'); } // 使用config.apiUrl和config.apiSecret进行API调用 }
3. 状态管理
- null 和 undefined:在状态管理中,如果一个状态在某些情况下还未初始化,可以用null或undefined表示。例如,在React应用中使用TypeScript进行状态管理时,一个用户信息状态可能在用户未登录时为null。
import React, { useState } from'react'; interface User { name: string; age: number; } const App: React.FC = () => { const [user, setUser] = useState<User | null>(null); const login = () => { setUser({ name: 'John', age: 30 }); }; const logout = () => { setUser(null); }; return ( <div> {user === null? ( <button onClick={login}>Login</button> ) : ( <div> <p>User: {user.name}</p> <button onClick={logout}>Logout</button> </div> )} </div> ); };
- never:在状态机相关的状态管理中,如果一个状态转换是不可能发生的,那么可以使用never类型来明确表示。例如,在一个简单的状态机中,某个状态不可能转换到另一个特定状态。
type State = 'loading' |'success' | 'error'; function transition(state: State): never | State { if (state === 'loading' && Math.random() > 0.5) { return'success'; } else if (state === 'loading') { return 'error'; } // 这里假设'success'状态不可能再转换到'loading'状态 if (state ==='success') { throw new Error('Invalid state transition'); // 理论上这里返回never类型,因为不会正常返回 } return state; }