类型转换 #

一、转换概述 #

在Deno/TypeScript中,类型转换分为显式转换(手动转换)和隐式转换(自动转换)。理解类型转换对于编写正确的代码至关重要。

二、转换为字符串 #

2.1 String()函数 #

typescript
console.log(String(123)); // "123"
console.log(String(3.14)); // "3.14"
console.log(String(true)); // "true"
console.log(String(false)); // "false"
console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
console.log(String([1, 2, 3])); // "1,2,3"
console.log(String({})); // "[object Object]"

2.2 toString()方法 #

typescript
const num = 123;
console.log(num.toString()); // "123"
console.log(num.toString(2)); // "1111011" (二进制)
console.log(num.toString(16)); // "7b" (十六进制)

const bool = true;
console.log(bool.toString()); // "true"

const arr = [1, 2, 3];
console.log(arr.toString()); // "1,2,3"

// null和undefined没有toString方法
// null.toString(); // 错误
// undefined.toString(); // 错误

2.3 模板字符串 #

typescript
const num = 123;
const bool = true;
const arr = [1, 2, 3];

console.log(`${num}`); // "123"
console.log(`${bool}`); // "true"
console.log(`${arr}`); // "1,2,3"

2.4 拼接空字符串 #

typescript
const num = 123;
console.log(num + ""); // "123"

const bool = true;
console.log(bool + ""); // "true"

2.5 JSON.stringify() #

typescript
const obj = { name: "Alice", age: 25 };
console.log(JSON.stringify(obj)); // '{"name":"Alice","age":25}'

const arr = [1, 2, 3];
console.log(JSON.stringify(arr)); // '[1,2,3]'

// 格式化输出
console.log(JSON.stringify(obj, null, 2));
// {
//   "name": "Alice",
//   "age": 25
// }

三、转换为数字 #

3.1 Number()函数 #

typescript
console.log(Number("123")); // 123
console.log(Number("3.14")); // 3.14
console.log(Number("123abc")); // NaN
console.log(Number("")); // 0
console.log(Number("  ")); // 0
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number([1])); // 1
console.log(Number([1, 2])); // NaN
console.log(Number({})); // NaN

3.2 parseInt()函数 #

typescript
console.log(parseInt("123")); // 123
console.log(parseInt("123.99")); // 123
console.log(parseInt("123abc")); // 123
console.log(parseInt("abc123")); // NaN
console.log(parseInt("10", 10)); // 10 (十进制)
console.log(parseInt("10", 2)); // 2 (二进制)
console.log(parseInt("ff", 16)); // 255 (十六进制)
console.log(parseInt("0xff")); // 255 (自动识别十六进制)

3.3 parseFloat()函数 #

typescript
console.log(parseFloat("3.14")); // 3.14
console.log(parseFloat("3.14abc")); // 3.14
console.log(parseFloat("3.14.15")); // 3.14
console.log(parseFloat("abc3.14")); // NaN
console.log(parseFloat("123")); // 123

3.4 一元加号运算符 #

typescript
console.log(+"123"); // 123
console.log(+"3.14"); // 3.14
console.log(+"123abc"); // NaN
console.log(+true); // 1
console.log(+false); // 0
console.log(+null); // 0
console.log(+undefined); // NaN

3.5 算术运算 #

typescript
console.log("123" - 0); // 123
console.log("123" * 1); // 123
console.log("123" / 1); // 123

四、转换为布尔值 #

4.1 Boolean()函数 #

typescript
// 假值(Falsy)
console.log(Boolean(false)); // false
console.log(Boolean(0)); // false
console.log(Boolean(-0)); // false
console.log(Boolean(0n)); // false
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false

// 真值(Truthy)
console.log(Boolean(true)); // true
console.log(Boolean(1)); // true
console.log(Boolean(-1)); // true
console.log(Boolean("hello")); // true
console.log(Boolean([])); // true
console.log(Boolean({})); // true
console.log(Boolean(() => {})); // true

4.2 双感叹号 #

typescript
console.log(!!1); // true
console.log(!!0); // false
console.log(!!"hello"); // true
console.log(!!""); // false
console.log(!!{}); // true
console.log(!!null); // false

4.3 逻辑上下文 #

typescript
const value = 0;

if (value) {
  console.log("真值");
} else {
  console.log("假值"); // 输出这个
}

// 短路求值
const name = "";
console.log(name || "默认名称"); // 默认名称

const count = 0;
console.log(count ?? 10); // 0 (空值合并只检查null/undefined)

五、转换为对象 #

5.1 Object()函数 #

typescript
const str = Object("hello");
console.log(str); // String {"hello"}
console.log(typeof str); // "object"

const num = Object(123);
console.log(num); // Number {123}
console.log(typeof num); // "object"

const bool = Object(true);
console.log(bool); // Boolean {true}
console.log(typeof bool); // "object"

5.2 从JSON解析 #

typescript
const jsonStr = '{"name":"Alice","age":25}';
const obj = JSON.parse(jsonStr);
console.log(obj.name); // Alice
console.log(obj.age); // 25

const jsonArr = '[1,2,3]';
const arr = JSON.parse(jsonArr);
console.log(arr); // [1, 2, 3]

六、数组与对象转换 #

6.1 字符串转数组 #

typescript
const str = "hello";
console.log(str.split("")); // ["h", "e", "l", "l", "o"]

const csv = "a,b,c";
console.log(csv.split(",")); // ["a", "b", "c"]

// Array.from
console.log(Array.from("hello")); // ["h", "e", "l", "l", "o"]

6.2 数组转字符串 #

typescript
const arr = [1, 2, 3];
console.log(arr.toString()); // "1,2,3"
console.log(arr.join("")); // "123"
console.log(arr.join("-")); // "1-2-3"
console.log(arr.join(", ")); // "1, 2, 3"

6.3 对象转数组 #

typescript
const obj = { a: 1, b: 2, c: 3 };

// 键数组
console.log(Object.keys(obj)); // ["a", "b", "c"]

// 值数组
console.log(Object.values(obj)); // [1, 2, 3]

// 键值对数组
console.log(Object.entries(obj)); // [["a", 1], ["b", 2], ["c", 3]]

6.4 数组转对象 #

typescript
const entries = [["a", 1], ["b", 2], ["c", 3]];
const obj = Object.fromEntries(entries);
console.log(obj); // { a: 1, b: 2, c: 3 }

const keys = ["a", "b", "c"];
const values = [1, 2, 3];
const obj2 = Object.fromEntries(keys.map((k, i) => [k, values[i]]));
console.log(obj2); // { a: 1, b: 2, c: 3 }

七、隐式类型转换 #

7.1 算术运算 #

typescript
// 字符串 + 任何类型 = 字符串拼接
console.log("1" + 2); // "12"
console.log("1" + true); // "1true"
console.log("1" + null); // "1null"
console.log("1" + undefined); // "1undefined"
console.log("1" + [1, 2]); // "11,2"
console.log("1" + {}); // "1[object Object]"

// 其他运算符会转换为数字
console.log("10" - 5); // 5
console.log("10" * 2); // 20
console.log("10" / 2); // 5
console.log("10" % 3); // 1

7.2 比较运算 #

typescript
// 宽松相等(==)会进行类型转换
console.log(1 == "1"); // true
console.log(0 == false); // true
console.log(0 == ""); // true
console.log(null == undefined); // true
console.log(null == 0); // false
console.log(undefined == 0); // false

// 严格相等(===)不进行类型转换
console.log(1 === "1"); // false
console.log(0 === false); // false
console.log(0 === ""); // false
console.log(null === undefined); // false

7.3 关系运算 #

typescript
// 数字比较
console.log(10 > "5"); // true
console.log("10" > 5); // true

// 字符串比较(按字典序)
console.log("b" > "a"); // true
console.log("10" > "9"); // false (字符串比较)

// 与NaN比较
console.log("hello" > 5); // false (NaN与任何数比较都是false)

7.4 逻辑运算 #

typescript
// 短路求值
console.log(0 || "default"); // "default"
console.log(1 || "default"); // 1
console.log("" && "value"); // ""
console.log("hello" && "value"); // "value"

// 空值合并
console.log(null ?? "default"); // "default"
console.log(undefined ?? "default"); // "default"
console.log(0 ?? "default"); // 0
console.log("" ?? "default"); // ""

八、类型转换表 #

8.1 转换为字符串 #

原始值 String() toString() 模板字符串
123 “123” “123” “123”
true “true” “true” “true”
null “null” 错误 “null”
undefined “undefined” 错误 “undefined”
[1,2] “1,2” “1,2” “1,2”
{} “[object Object]” “[object Object]” “[object Object]”

8.2 转换为数字 #

原始值 Number() parseInt() parseFloat() +
“123” 123 123 123 123
“3.14” 3.14 3 3.14 3.14
“123abc” NaN 123 123 NaN
“” 0 NaN NaN 0
true 1 NaN NaN 1
false 0 NaN NaN 0
null 0 NaN NaN 0
undefined NaN NaN NaN NaN

8.3 转换为布尔值 #

原始值 Boolean() !!
0 false false
1 true true
“” false false
“hello” true true
null false false
undefined false false
NaN false false
[] true true
{} true true

九、TypeScript类型断言 #

9.1 尖括号语法 #

typescript
const value: unknown = "hello";
const length: number = (<string>value).length;
console.log(length); // 5

9.2 as语法 #

typescript
const value: unknown = "hello";
const length: number = (value as string).length;
console.log(length); // 5

// 联合类型断言
function getLength(value: string | number): number {
  if (typeof value === "string") {
    return (value as string).length;
  }
  return String(value as number).length;
}

9.3 非空断言 #

typescript
function greet(name: string | null) {
  console.log(name!.toUpperCase()); // 确定name不为null
}

greet("Alice"); // ALICE
// greet(null); // 运行时错误

9.4 双重断言 #

typescript
const value = "hello" as unknown as number;
// 危险:可能导致运行时错误

十、最佳实践 #

10.1 使用严格相等 #

typescript
// 推荐
if (value === null) { }
if (value === undefined) { }
if (value === 0) { }

// 不推荐
if (value == null) { }
if (value == undefined) { }
if (value == 0) { }

10.2 显式转换 #

typescript
// 推荐:显式转换
const num = Number(str);
const str = String(num);
const bool = Boolean(value);

// 不推荐:依赖隐式转换
const num = +str;
const str = num + "";

10.3 检查类型 #

typescript
function process(value: unknown) {
  if (typeof value === "string") {
    console.log(value.toUpperCase());
  } else if (typeof value === "number") {
    console.log(value.toFixed(2));
  } else if (Array.isArray(value)) {
    console.log(value.join(", "));
  }
}

十一、总结 #

本章学习了:

  • 转换为字符串的方法
  • 转换为数字的方法
  • 转换为布尔值的方法
  • 数组与对象的相互转换
  • 隐式类型转换规则
  • TypeScript类型断言
  • 最佳实践

下一章,我们将学习TypeScript类型系统。

最后更新:2026-03-28