TypeScript Never 和 Unknown
发布时间:2023-03-30 08:52:17 所属栏目:教程 来源:
导读:本节介绍 never 和 unkNown 类型,其中 unkNown 类型作为 any 类型对应的安全类型使用起来更加安全,如果有 any 类型的使用需求,应尽量使用 unkNown 类型来替代 any 类型。
never 类型表示那些永不存在的值的类型
never 类型表示那些永不存在的值的类型
本节介绍 never 和 unkNown 类型,其中 unkNown 类型作为 any 类型对应的安全类型使用起来更加安全,如果有 any 类型的使用需求,应尽量使用 unkNown 类型来替代 any 类型。 never 类型表示那些永不存在的值的类型。 unkNown 类型是 any 类型对应的安全类型。 never 类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身之外)。 即使 any 也不可以赋值给 never。 一个抛出异常的函数表达式,其函数返回值类型为 never: function error(message:string): never { throw new Error(message) } 同样的,不会有返回值的函数表达式,其函数返回值类型也为 never: // 推断的返回值类型为 never function fail(): never { return error("Something Failed") } 不能取得值的地方: interface Foo { type: 'foo' } interface Bar { type: 'bar' } type All = Foo | Bar function handleValue(val: All) { switch (val.type) { case 'foo': break case 'bar': break default: // 此处不能取值 const exhaustiveCheck: never = val break } } 代码解释: 代码中所用到的接口声明(interface)、类型别名(type)、联合类型(A | B)之后都有专门小节介绍。 我们知道 any 无需事先执行任何类型的检查: let value: any value = true // OK value = // OK value = "Hello World" // OK value = [] // OK value = {} // OK value = Math.random // OK value = null // OK value = undefined // OK value = new TypeError() // OK value = Symbol('name') // OK value.foo.bar // OK value.trim() // OK value() // OK new value() // OK value[][] // OK 在许多情况下,这太宽松了。 unkNown 类型呢? let value: unkNown value = true // OK value = // OK value = "Hello World" // OK value = [] // OK value = {} // OK value = Math.random // OK value = null // OK value = undefined // OK value = new TypeError() // OK value = Symbol('name') // OK 所有对该 value 变量的分配都被认为是类型正确的。 但是,如果尝试: let value: unkNown let value1: unkNown = value // OK let value2: any = value // OK let value3: boolean = value // Error let value4: number = value // Error let value5: string = value // Error let value6: object = value // Error let value7: any[] = value // Error 可以看到,该 unkNown 类型只能分配给 any 类型和 unkNown 类型本身。 现在继续尝试: let value: unkNown value.foo.bar // Error value.trim() // Error value() // Error new value() // Error value[][] // Error unkNown 类型在被确定为某个类型之前,不能被进行诸如函数执行、实例化等操作,一定程度上对类型进行了保护。 在那些将取得任意值,但不知道具体类型的地方使用 unkNown,而非 any。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |