【TS】类型别名和类型推断

本文详细解读了TypeScript中类型声明的原理,包括可选参数、默认值和类型别名的使用。通过实例展示了函数类型定义、联合类型、类型断言及解构赋值类型注解。深入理解了如何在实际开发中利用这些特性提高代码质量和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在TS中凡是在冒号: 后面的都是在声明类型和实际业务逻辑并无关系,是对参数和返回值类型约束的写法。

?标识符表示可选,可选参数需置后。添加默认值的参数也会自动识别为可选参数。

function add(x: number, y: number, z?: number, q: number = 10): number {
    if(typeof z === 'number'){
        return x + y + z
    }else {
       return x + y 
    }
    
}
let result = add(2, 3)

// 函数表达式
const add2 = function (x: number, y: number, z?: number, q: number = 10): number {
    if(typeof z === 'number'){
        return x + y + z
    }else {
       return x + y 
    }
}

const add2: (x: number, y: number, z?: number) => number = add

此处的箭头不是es6中的箭头函数,而是TS中声明函数类型返回值的一种方法。 

类型别名

// 用类型别名实现联合类型
type NameResolver = () => string
type NameOrResolver = string | NameResolver
function getName(n: NameOrResolver): string {
    if(typeof n === 'string') {
        return n
    } else {
        return n()
    }
}

类型断言

未指定类型时TS会给出推断类型,因此再次给变量赋不同类型的值时会报语法错误

let str = 'str'
str = 123 // 未指定类型时TS会给出推断类型,因此再次给变量赋不同类型的值时这里会报语法错误
// 无返回值类型函数
function sayHello(): never {
  while(true) {}
}
// 永远不会执行完成的函数类型
function errorEmitter(): never {
  throw new Error() 
  while (true) {}
}

//解构赋值类型注解方法
function addObj({ first, second }: { first: number; second: number }): number {
  return first + second;
}
const totalObj = addObj({ first: 1, second: 2 });

类型断言 

function getLength(input: string | number): number {
    
    // 把input 断言为 string
    if((<string>input).length) {
        return (<string>input).length
    }else {
        return input.toString().length
    }
}

<think>嗯,用户想了解TypeScript类型使用指南常见问题。首先,我需要整理一下已有的引用资料。引用[1]提到了基本数据类型类型注解的重要性,引用[2]讲的是接口对象类型,引用[3]涉及类型推断,引用[4]讨论了条件类型中的联合类型处理。 用户的需求可能包括基础类型的使用、高级类型如联合类型类型别名、接口,以及类型推断类型守卫这些常见问题。需要分步骤解释,先讲基础,再深入高级特性,然后解决常见问题。 首先,类型注解是TypeScript的核心,应该从基本类型开始,比如string、number、boolean等,然后介绍数组元组。接着是联合类型类型别名,这部分引用[4]中的联合类型处理需要注意。 然后是接口对象类型,引用[2]提到接口的作用,需要详细说明如何定义接口可选属性。类型推断部分可以引用[3],区分letconst的不同推断结果。 高级类型方面,泛型、条件类型类型守卫都需要覆盖,引用[4]中的条件类型处理联合类型的情况要举例说明。常见问题部分,类型不匹配、联合类型操作类型断言的风险都是重点,需要结合引用中的内容。 最后,生成相关问题时要围绕用户可能遇到的进阶问题,比如类型兼容性、高级工具类型的使用,以及性能优化等。确保引用标记正确,每个引用对应正确的知识点。整个回答结构要清晰,逐步引导用户从基础到高级,同时解决他们可能遇到的常见问题。</think>### TypeScript 类型使用指南与常见问题 #### 一、TypeScript 类型核心概念 1. **基本类型注解** TypeScript 提供了与 JavaScript 相同的基础类型(如 `string`、`number`、`boolean`),并通过类型注解增强代码安全性。例如: ```typescript let name: string = "Alice"; const age: number = 30; ``` 类型注解可显式定义变量类型,减少运行时错误[^1]。 2. **数组与元组** - 数组类型:`number[]` 或 `Array<number>` - 元组类型:固定长度类型的数组,如 `[string, number]` ```typescript let tuple: [string, number] = ["TypeScript", 2023]; ``` 3. **联合类型类型别名** - 联合类型通过 `|` 组合多种类型:`string | number` - 类型别名通过 `type` 定义复杂类型: ```typescript type ID = string | number; ``` #### 二、对象类型与接口 1. **接口定义** 接口用于描述对象结构,支持可选属性只读属性[^2]: ```typescript interface User { readonly id: number; name: string; email?: string; // 可选属性 } ``` 2. **类型推断规则** - `let` 声明的变量推断为基本类型(如 `string`) - `const` 声明的常量推断为字面量类型(如 `"JavaScript"`)[^3] ```typescript let s1 = "JavaScript"; // 类型: string const s2 = "JavaScript"; // 类型: "JavaScript" ``` #### 三、高级类型技巧 1. **泛型与条件类型** - 泛型支持类型参数化: ```typescript function identity<T>(arg: T): T { return arg; } ``` - 条件类型根据条件返回不同类型,联合类型会逐成员处理[^4]: ```typescript type IsString<T> = T extends string ? true : false; ``` 2. **类型守卫与类型断言** - 类型守卫:通过 `typeof`、`instanceof` 或自定义函数缩小类型范围 - 类型断言:显式指定类型(需谨慎使用): ```typescript let value: any = "hello"; let length: number = (value as string).length; ``` #### 四、常见问题与解决方案 1. **类型不匹配错误** - **场景**:将 `string` 赋值给 `number` 类型变量 - **解决**:检查赋值逻辑或使用类型转换 2. **联合类型操作限制** - **场景**:`string | number` 类型变量无法直接调用 `toUpperCase()` - **解决**:使用类型守卫缩小范围: ```typescript if (typeof value === "string") { value.toUpperCase(); } ``` 3. **类型断言的风险** - **场景**:错误使用 `as` 导致运行时异常 - **建议**:优先使用类型守卫或重构代码逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值