TS(TypeScript)基础知识六:(Literal) 文字类型

1,562 阅读2分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

Literal类型

本章介绍一个TS中的特殊类型Literal(除了一般类型的字符串和数字外,我们还可以在类型位置引用特定的字符串和数字)以此来达到某些妙用。

常量

来看一个例子:使用文字类型来实现类似常量的功能。借此例子来了解下其基本运行机制。

let s: 'hw' = 'hw'

let n: 1 = 1;

上例中:声明s的值为字符串‘hw';n的值为1;之后不能修改。

但是拥有一个只能有一个值的变量并没有多大用处,使用const可以轻松实现

联合类型

我们可以通过将文字组合成联合类型,可以表达一个更有用的概念

例如,只接受一组特定已知值的函数

type a = -1 | 0 | 1
function compare(a: string, b: string): a {
  return a === b ? 0 : a > b ? 1 : -1;
}

上例中假设我们需要一个版本对比方法compare,其中的返回值只接受0,1,-1三个值。

结合接口

我们也可以结合接口一起使用:

interface f {
  age: number;
}
type s = f | 'son'
function fn(x: s) { }
fn({ age: 100 });
fn("son");

上例中,别名s兼具接口f的规则。

还有一种特殊文字类型:布尔类型。布尔类型只有两种布尔文字类型,分别是是 true 和 false 类型。由此可见类型 boolean 本身实际上只是文字类型中的联合类型

应用

下面通过一个例子,展示下实际项目中的应用

我们声明一个http请求方法,并调用它,看下面的例子:

type obj = {
  url: string;
  method: "GET" | "POST"
}
function http(arg: obj) {  }
let params = { url: 'www.lsdj.sdf', method: "GET" }
http(params)

//Type 'string' is not assignable to type '"GET" | "POST"'.

解析:
我们声明的变量params中method的值是字符串类型,所以TS帮我将method推断为字符串类型。但是我们封装的请求方法http中只接受文字类型 "GET" | "POST"!如果想要让这段代码正常运行就需要改变params中method的类型

let params = { url: 'www.lsdj.sdf', method: "GET" as "GET" } 
let params = { url: 'www.lsdj.sdf', method: "GET" } as const

上面两种方式,都可以满足我们的需求

对象常量

除了readonly修饰符外,其他方式让对象内的值不可修改

let obj = { a: 1} as const;

as const 后缀的作用类似于 const,但对于类型系统,确保所有属性都分配为文字类型,而不是更通用的版本,如字符串或数字。