面试题答案
一键面试- 明确参数类型:
- 使用类型别名或接口来清晰定义参数类型。例如,假设有一个函数接收两个数字并返回它们的和:
// 使用类型别名定义参数类型 type AddNumbersArgs = { num1: number; num2: number; }; const addNumbers = ({ num1, num2 }: AddNumbersArgs): number => { return num1 + num2; }; // 或者使用接口定义参数类型 interface AddNumbersArgsInterface { num1: number; num2: number; } const addNumbers2 = ({ num1, num2 }: AddNumbersArgsInterface): number => { return num1 + num2; };
- 定义返回值类型:
- 在函数签名中明确指定返回值类型。上面的例子中,
addNumbers
和addNumbers2
函数都明确返回number
类型。 - 如果函数可能返回
null
或undefined
,也要在返回类型中体现。例如,一个函数在找不到值时返回null
:
type FindValueArgs = { arr: number[]; target: number; }; const findValue = ({ arr, target }: FindValueArgs): number | null => { const index = arr.indexOf(target); if (index!== -1) { return arr[index]; } return null; };
- 在函数签名中明确指定返回值类型。上面的例子中,
- 使用泛型(如果适用):
- 当函数逻辑不依赖于具体类型,但需要保持类型一致性时,使用泛型。例如,一个简单的
identity
函数,返回传入的值:
const identity = <T>(arg: T): T => { return arg; }; const result = identity<string>('hello');
- 当函数逻辑不依赖于具体类型,但需要保持类型一致性时,使用泛型。例如,一个简单的
- 可选参数和默认参数:
- 如果函数有可选参数,要在类型定义中体现。例如,一个函数接收一个字符串和一个可选的数字:
type PrintMessageArgs = { message: string; count?: number; }; const printMessage = ({ message, count = 1 }: PrintMessageArgs): void => { for (let i = 0; i < count; i++) { console.log(message); } };