typescript中的?号和!的意思

本文探讨了JavaScript中三目运算符(?)的条件选择和可选参数的使用,以及感叹号(!)用于成员断言和安全链式调用的场景。重点讲解了如何通过?和!来处理可能存在的可选属性和确保代码的健壮性。

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

一、? 号操作符

1、三目运算符

// 当 isNumber(input) 为 True 是返回 ? : 之间的部分; isNumber(input) 为 False 时
// 返回 : ; 之间的部分
const a = isNumber(input) ? input : String(input);

2、参数(?表示一个可选参数)

// 这里的 ?表示这个参数 field 是一个可选参数
function getUser(user: string, field?: string) {
}

3、成员(?表示属性可能不存在)

// 这里的?表示这个name属性有可能不存在
class A {
  name?: string
}

interface B {
  name?: string
}

4、安全链式调用

// 这里 Error对象定义的stack是可选参数,如果这样写的话编译器会提示
// 出错 TS2532: Object is possibly 'undefined'.
return new Error().stack.split('\n');

// 我们可以添加?操作符,当stack属性存在时,调用 stack.split。若stack不存在,则返回空
return new Error().stack?.split('\n');

// 以上代码等同以下代码, 感谢 @dingyanhe 的监督
const err = new Error();
return err.stack && err.stack.split('\n');

二、!操作符

1、一元运算

// ! 就是将之后的结果取反,比如:
// 当 isNumber(input) 为 True 时返回 False; isNumber(input) 为 False 时返回True
const a = !isNumber(input);

2、成员

// 因为接口B里面name被定义为可空的值,但是实际情况是不为空的,那么我们就可以
// 通过在class里面使用!,重新强调了name这个不为空值
class A implemented B {
  name!: string
}

interface B {
  name?: string
}

3、强制链式调用

// 这里 Error对象定义的stack是可选参数,如果这样写的话编译器会提示
// 出错 TS2532: Object is possibly 'undefined'.
new Error().stack.split('\n');

// 我们确信这个字段100%出现,那么就可以添加!,强调这个字段一定存在
new Error().stack!.split('\n');
### 回答1: 在 TypeScript 中,`!` 表示对一个变量断言其非空。也就是说,你可以使用 `!` 来告诉 TypeScript 编译器,某个变量在某个时候一定有值,从而避免出现空引用的错误。 例如: ``` let foo: string | undefined; foo = 'hello'; console.log(foo.length); // OK foo = undefined; console.log(foo.length); // Error console.log(foo!.length); // OK ``` 在上面的代码中,`foo` 是一个可以为 `undefined` 的字符串类型。当我们给 `foo` 赋值 `'hello'` 时,调用 `foo.length` 是没有问题的。但是当我们将 `foo` 赋值为 `undefined` 后,再调用 `foo.length` 就会报错,因为此时 `foo` 为空。但是如果使用 `foo!` 来代替 `foo`,就可以避免出现空引用的错误。 ### 回答2: 在TS中,"!"代表非空断言(non-null assertion)的意思。 在TypeScript中,每个变量都有一个类型。但有些情况下,我们可能知道一个变量不会是null或undefined,但是TS的类型系统并不会自动推断出来。这时,我们可以使用"!"来表示对该变量进行非空断言。 当使用非空断言时,我们告诉TS编译器,我们确认该变量不会是null或undefined,可以放心地使用它,而不需要进行空值检查。 例如: ```typescript let username: string | null = getUserFromAPI(); // username可以是字符串,也可能是null let length: number = username!.length; // 使用非空断言来确保username不是null,直接获取其length属性 ``` 需要注意的是,使用非空断言时需要确保我们对变量进行了适当的判空处理,否则可能会导致运行时错误。因此,我们应该在使用非空断言之前,对变量进行必要的空值检查,以保证程序的健壮性。 ### 回答3: 在TS中,"!"代表非空断言(Non-null Assertion)的意思。它可以用于告诉编译器一个变量一定不会是null或undefined,即使它的类型定义中包含了null或undefined的可能性。 当我们使用"!"对一个变量进行非空断言时,我们告诉编译器不需要再对该变量进行类型检查,可以确保它不会是null或undefined。这样可以避免在使用非空值时出现编译错误或运行时错误。 非空断言的语法是在变量名后面加上一个感叹"!"。例如,如果我们声明一个可能为null或undefined的变量,我们可以使用非空断言来确保这个变量不会为null或undefined: let height: number | null = 150; let fixedHeight = height!; 在上述代码中,我们声明了一个height变量,它的类型定义中同时包含了numbernull。然后我们使用非空断言将height赋值给fixedHeight,因为我们确定该变量不会为null或undefined。 需要注意的是,非空断言并不能修改变量的实际值,它仅仅在类型检查阶段起作用。因此,如果我们对一个null或undefined的变量进行非空断言,仍然会在运行时报错。所以在使用非空断言时,我们需要确保自己的逻辑不会导致实际的null或undefined值的出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值