Appearance
文字类型
除了一般类型 string 和 number ,我们可以在类型位置引用特定的字符串和数字。
一种方法是考虑 JavaScript 如何以不同的方式声明变量。 var 而 let 两者都允许更改变量中保存的内容, const 不允许,这反映在 TypeScript 如何为文字创建类型上。
typescript
let testString = "Hello World";
testString = "Olá Mundo";
// 'testString'可以表示任何可能的字符串,那TypeScript是如何在类型系统中描述它的
testString;
const constantString = "Hello World";
// 因为'constantString'只能表示1个可能的字符串,所以具有文本类型表示
constantString;
就其本身而言,文字类型并不是很有价值:
typescript
let x: "hello" = "hello";
// 正确
x = "hello";
// 错误
x = "howdy";
拥有一个只能有一个值的变量并没有多大用处! 但是通过将文字组合成联合,你可以表达一个更有用的概念——例如,只接受一组特定已知值的函数:
typescript
function printText(s: string, alignment: "left" | "right" | "center") {
// ...
}
printText("Hello, world", "left");
printText("G'day, mate", "centre");
数字文字类型的工作方式相同:
typescript
function compare(a: string, b: string): -1 | 0 | 1 {
return a === b ? 0 : a > b ? 1 : -1;
}
当然,你可以将这些与非文字类型结合使用:
typescript
interface Options {
width: number;
}
function configure(x: Options | "auto") {
// ...
}
configure({ width: 100 });
configure("auto");
configure("automatic");
还有一种文字类型:布尔文字。只有两种布尔文字类型,它们是类型 true 和 false 。类型 boolean 本身实际上只是联合类型 union 的别名 true | false 。
- 文字推理 当你使用对象初始化变量时,TypeScript 假定该对象的属性稍后可能会更改值。例如,如果你写了这样的代码:
typescript
const obj = { counter: 0 };
if (someCondition) {
obj.counter = 1;
}
TypeScript 不假定先前具有的字段值 0 ,后又分配 1 是错误的。另一种说法是 obj.counter 必须有 number 属性, 而非是 0 ,因为类型用于确定读取和写入行为。 这同样适用于字符串:
typescript
function handleRequest(url: string, method: 'GET' | 'POST' | 'GUESS') {
// ...
}
const req = { url: 'https://example.com', method: 'GET' };
handleRequest(req.url, req.method);
在上面的例子 req.method 中推断是 string ,不是 "GET" 。因为代码可以在创建 req 和调用之间进行 评估,TypeScript 认为这段代码有错误。 有两种方法可以解决这个问题。
- 可以通过在任一位置添加类型断言来更改推理:
typescript
// 方案 1:
const req = { url: "https://example.com", method: "GET" as "GET" };
// 方案 2
handleRequest(req.url, req.method as "GET");
方案 1 表示“我打算 req.method 始终拥有文字类型 "GET" ”,从而防止之后可能分配 "GUESS" 给该字 段。 方案 2 的意思是“我知道其他原因 req.method 具有 "GET" 值”。 2. 可以使用 as const 将整个对象转换为类型文字:
typescript
const req = { url: "https://example.com", method: "GET" } as const;
handleRequest(req.url, req.method);
该 as const 后缀就像 const 定义,确保所有属性分配的文本类型,而不是一个更一般的 string 或 number