1.. 一个问号(?)在 TypeScript 中用于表示可选属性和可选参数,使得属性和参数可以选择性地存在。
可选属性: 在对象类型中,可以使用问号来标记某个属性是可选的。这意味着该属性可以存在,也可以不存在。例如:
- interface Person {
- name: string;
- age?: number;
- }
-
- const person1: Person = { name: "John" };
- const person2: Person = { name: "Jane", age: 25 };
在上面的例子中,age 属性被标记为可选,因此可以在对象中选择性地包含它。
可选参数: 在函数的参数列表中,可以使用问号来标记某个参数是可选的。这意味着在调用函数时,可以选择性地省略该参数。例如:
- function greet(name: string, age?: number) {
- console.log(`Hello, ${name}! You are ${age} years old.`);
- }
-
- greet("John"); // 输出:Hello, John! You are undefined years old.
- greet("Jane", 25); // 输出:Hello, Jane! You are 25 years old.
在上面的例子中,age 参数被标记为可选,因此可以选择性地在函数调用中省略它。
2. 两个问号(??)表示一个空值合并运算符。
两个问号(??)是一个空值合并运算符,用于检查一个值是否为null或undefined,并在其为null或undefined时提供一个默认值。例如、
- const value1 = null;
- const value2 = 42;
-
- const result1 = value1 ?? "Default Value"; // Output: Default Value
- const result2 = value2 ?? "Default Value"; // Output: 42
3. 一个感叹号
在TypeScript里面有3个地方会出现感叹号操作符,他们分别是
// ! 就是将之后的结果取反,比如: // 当 isNumber(input) 为 True 时返回 False; isNumber(input) 为 False 时返回True const a = !isNumber(input);
// 因为接口B里面name被定义为可空的值,但是实际情况是不为空的,那么我们就可以
// 通过在class里面使用!,重新强调了name这个不为空值
class A implemented B {
name!: string
}
叹号(!)是一种非空断言操作符(non-null assertion operator)。它告诉编译器,表达式的结果不会为 null 或 undefined,即使它的类型可能允许为 null 或 undefined。它用于在编译时绕过TypeScript的类型检查。
// 我们确信这个字段100%出现,那么就可以添加!,强调这个字段一定存在
new Error().stack!.split('\n');
- function greet(person: Person) {
- console.log(`Hello, ${person.name.toUpperCase()}!`);
- }
-
- const person: Person = { name: "John" };
- greet(person!);
在上述例子中,我们使用感叹号(!)告诉编译器person对象肯定不为null或undefined,以便在调用greet函数时可以安全地访问name属性。
4.两个感叹号(!!)
let is_valid = !!test; 在TypeScript中,这种用法是将变量test转换为布尔类型,并将结果赋值给变量is_valid。!!是逻辑非运算符的两次连续使用,它会将变量转换为布尔类型的值。如果test的值为真,则is_valid将被赋值为true;如果test的值为假,则is_valid将被赋值为false。这种用法可以用于简单地判断一个变量是否有值或是否为真。
Double exclamation marks !! in TypeScript
While we’re on the topic of the exclamation mark !, TypeScript also uses double exclamation marks !! to convert (also called cast) non-Boolean type values to Boolean type. Here’s an example:
const emptyStr = '' const nonEmptyStr = 'test' const emptyStrBool = !!emptyStr //false const nonEmptyStrBool = !!nonEmptyStr //true