这是我参与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,但对于类型系统,确保所有属性都分配为文字类型,而不是更通用的版本,如字符串或数字。