面试题答案
一键面试1. 使用索引类型处理动态字段名
在TypeScript中,索引类型允许我们定义对象类型,其属性名是动态的。例如,假设GraphQL查询返回的数据可能包含动态字段:
// 定义一个索引类型来处理动态字段
type DynamicFields = {
[key: string]: any;
};
// 假设这是GraphQL查询返回的数据
const graphQLData: DynamicFields = {
field1: 'value1',
field2: 42
};
// 访问动态字段
console.log(graphQLData['field1']);
在实际项目场景中,比如一个多语言内容管理系统,不同语言的字段名会动态变化。可以使用索引类型来定义响应数据结构:
// 假设GraphQL查询返回不同语言的内容
type TranslatedContent = {
[language: string]: string;
};
// 假设GraphQL查询返回的数据
const content: TranslatedContent = {
en: 'Hello',
fr: 'Bonjour'
};
2. 利用条件类型处理值类型变化
条件类型可以根据类型的条件来选择不同的类型。例如,GraphQL查询结果中某个字段的值类型可能是string
或number
:
// 定义一个条件类型
type StringOrNumber = string | number;
type ValueType<T> = T extends string ? string : number;
// 假设GraphQL查询返回的数据
const data: StringOrNumber = 'test';
const value: ValueType<typeof data> = data;
在电商项目中,商品的价格字段可能在某些情况下是固定价格(number
),在促销时可能是一个描述(string
):
type PriceValue = string | number;
type PriceType<T extends PriceValue> = T extends string ? string : number;
// 假设GraphQL查询返回商品价格
const productPrice: PriceValue = 100;
const price: PriceType<typeof productPrice> = productPrice;
3. 结合GraphQL Code Generator
使用GraphQL Code Generator可以根据GraphQL schema自动生成TypeScript类型定义。这能确保TypeScript类型与GraphQL schema保持一致。例如,在一个全栈Web应用项目中:
- 安装
@graphql-codegen/cli
和相关插件。 - 配置
codegen.yml
文件:
schema: src/schema.graphql
documents: src/graphql/queries/*.graphql
generates:
src/types/graphql.ts:
plugins:
- typescript
- typescript-operations
- 运行生成命令
npx graphql-codegen
,生成的TypeScript类型会准确反映GraphQL schema中的类型,包括可能的动态类型情况,从而在代码中提供类型安全保障。
4. 类型断言与类型守卫
当从GraphQL获取的数据需要在特定逻辑中处理不同类型时,可以使用类型断言和类型守卫。例如:
// 类型守卫函数
function isString(value: any): value is string {
return typeof value ==='string';
}
// 假设GraphQL查询返回的数据
const result: string | number = 42;
if (isString(result)) {
console.log(result.length);
} else {
console.log(result.toFixed(2));
}
在社交媒体项目中,用户发布的内容可能是文本(string
)或图片URL(也可以是string
但有不同处理逻辑),通过类型守卫和类型断言可以安全地处理不同类型的数据。