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