类型断言用于指定更具体的类型:
比如:
let the_canvas_element = document.getElementById('the_canvas_element')
以上代码对于 ts 来说它只知道 the_canvas_element 变量是一个 Element 类型的元素或者 null。
但是很显然在这种情况下我们知道该元素是一个 HTMLCanvasElement,于是我们可以通过类型断言指定更具体的元素:
方法一:用 as + 更具体的类型
let the_canvas_element = document.getElementById('the_canvas_element') as HTMLCanvasElement
方法二:
let the_canvas_element = <HTMLCanvasElement>document.getElementById('the_canvas_element')
类型断言在编译时被删除,不会影响代码运行时行为.
ts 只允许类型断言转化为更具体或更宽松的类型,这个规则可以防止不可能的强制类型转换.
类型断言的实际使用场景:
function request_data(url:string, method: 'GET' | 'POST') {
console.log(url + method)
}
const obj = {
url: 'http://backend.com',
method: 'GET'
}
request_data(obj.url, obj.method)
以上代码会提示:类型“string”的参数不能赋给类型“"GET" | "POST"”的参数。
我们需要显示地告诉 ts: 虽然 obj.method 的类型的 string 类型的变量,但是我们很确定 method 的只会是 ‘GET' | 'POST' 之中的一个:
method: 'GET' as 'GET' | 'POST'
另一种方法:
const obj = {
url: 'http://backend.com',
method: 'GET'
} as const
一个对象 as const 之后,它里面的属性(或属性的属性一直递归下去)不能修改了
!非空断言:
function show(n: number | null) {
console.log(n!.toFixed(2))
}
show(20)
当show的参数真的为 null 的时候,就会抛出运行时异常
网友评论