面试题答案
一键面试- 实现思路
- 类型推断与定义:首先尝试根据第三方库文档或观察返回数据的示例,手动推断数据的类型结构并定义TypeScript类型。如果无法明确具体类型,可使用
any
类型作为初始占位,后续逐步细化。 - 类型守卫(Type Guards):使用类型守卫函数来在运行时检查数据的类型,从而在特定代码块中细化类型。类型守卫函数通常返回一个类型谓词,即
parameter is Type
形式的表达式。 - 类型转换(Type Casting):当通过类型守卫确认了数据的类型后,可使用类型转换将
any
类型转换为更具体的类型,以便在后续代码中进行类型安全的操作。
- 类型推断与定义:首先尝试根据第三方库文档或观察返回数据的示例,手动推断数据的类型结构并定义TypeScript类型。如果无法明确具体类型,可使用
- 代码示例 假设第三方库返回的数据可能是一个包含不同类型属性的对象,如下:
// 引入第三方库
const thirdPartyLib = require('third - party - lib');
// 调用第三方库,返回的数据类型不明确,初始用any
let data: any = thirdPartyLib.getData();
// 定义类型守卫函数
function isObjectWithNameAndAge(obj: any): obj is { name: string; age: number } {
return typeof obj === 'object' && 'name' in obj && typeof obj.name ==='string' && 'age' in obj && typeof obj.age === 'number';
}
// 使用类型守卫
if (isObjectWithNameAndAge(data)) {
// 这里data已经被细化为 { name: string; age: number } 类型
console.log(`Name: ${data.name}, Age: ${data.age}`);
} else {
console.log('Data does not match expected structure');
}
// 类型转换示例
let num: any = '123';
// 使用类型断言进行类型转换
let numAsNumber: number = num as number; // 这里运行时会出错,因为 '123' 不能直接转换为number,仅作示例
// 更好的方式是先进行类型检查
if (typeof num === 'number') {
numAsNumber = num;
console.log(numAsNumber + 1);
} else {
console.log('Not a number');
}
在上述示例中,通过定义类型守卫函数isObjectWithNameAndAge
来检查数据是否符合特定结构,在通过类型守卫检查的代码块中,数据的类型得到细化,从而可以安全地访问对象属性。同时展示了类型转换的基本用法,强调在进行类型转换前最好先进行类型检查以确保类型安全。