首页 > 其他分享 >Ts的值类型-unknow 、any、void、never区别及场景

Ts的值类型-unknow 、any、void、never区别及场景

时间:2023-11-02 13:55:45浏览次数:31  
标签:function unknow void never let 类型 any

Ts的类型设计理念在于集合理论,上层的类型集合了下层的类型;如上图所示,unknow为顶端类型,never为底端类型。除此之外ts还提供了高级的类型:并集和交集等高级类型。

any类型

当一个值类型为any时,则表示它可以为任何类型的值,any类型本质是不对值进行合法性校验,所以任何语法在这个值上都是合法的,是不安全的类型

let obj: any = { x: 0 };
// 对值不做校验,任何方法都是合法的,这也就意味着存在隐患
obj.foo();
obj();
obj.bar = 100;
obj = "hello";
//可以赋值给任何类型的变量,不做校验
const n: number = obj;

如果没有指定类型,ts不能推断类型,默认为any类型,可以用noImplicitAny将隐式的any标记为错误

unknow 类型

最上面的图我们可以看到unknow是所有类型的集合,是顶端类型,是安全的类型;unknown 类型的值进行任何操作都是不合法的

function f1(a: any) {
  a.b(); // OK
}
function f2(a: unknown) {
  a.b();
'a' is of type 'unknown'.
}

思考个问题:any类型存在的意义?如果知道值类型,直接通过具体类型对值进行约束,不确定类型的时候可以用更安全的unknown

never 类型

如上图所示,never类型是底端类型,也即是所有类型的子类型。

let n:never = fn()
let m:number = 10
let z:null;
let x:undefine;
m=n; //ok
n=z; //error
n=x; //error

在返回类型中,这意味着函数抛出异常或终止程序的执行

//抛出异常
function fail(msg: string): never {
  throw new Error(msg);
}
//无法终止
function for():never{
  while(true){}
}

当 TypeScript 确定联合中没有任何内容时,never 也会出现。超过了仅有的可能性的情况下,是never

function fn(x: string | number) {
  if (typeof x === "string") {
    // do something
  } else if (typeof x === "number") {
    // do something else
  } else {
    x; // has type 'never'!
  }
}

unreachable code检查

  • 通过手动标记函数返回值为 never 类型,来帮助编译器识别「unreachable code」
function listen(): never {
  throw new Error();
}
listen();
console.log("!!!");

  • never 可以收窄类型,当有多个类型存在的时候进行类型检查
function throwError(): never {
  throw new Error();
}
 
function firstChar(msg: string | undefined) {
  if (msg === undefined)
    throw Error();
  let chr = msg.charAt(1) // ✅
}

void类型

void 类型的变量只能赋值undefined

let unusable: void = undefined; //ok
let unusable: void = null; //Type 'null' is not assignable to type 'void'

函数只要没有显性的返回值,ts推断后返回值的类型都是undefine;

unction f5():void{
  return ;
}
const fv5 = f5();
console.log(fv5);//undefine

[函数的可分配性]函数返回void类型 表示不返回值的函数类型。返回类型为 void 的上下文键入 不 会强制函数返回某些内容。 另一种说法是具有 void 返回类型 (type voidFunc = () => void) 的上下文函数类型,当实现时,可以返回任何其他值,但会被忽略

type voidFunc = () => void;
 
const f1: voidFunc = () => {
  return "134";
};
const v1 = f1();

console.log(v1)
const temp = v1.length; //这里会报错,因为 temp 是 void 类型的,而不是string

参考博客:
https://blog.csdn.net/qq_36380426/article/details/124418159

标签:function,unknow,void,never,let,类型,any
From: https://www.cnblogs.com/perfectLi/p/17804682.html

相关文章

  • 记一次 Redisson 线上问题 → ERR unknown command 'WAIT' 的排查与分析
    开心一刻昨晚和一个朋友聊天我:处对象吗,咱俩试试?朋友:我有对象我:我不信,有对象不公开?朋友:不好公开,我当的小三问题背景程序在生产环境稳定的跑着jarjar自己在开发环境也做了主流业务的测试,没有任何异常,稳如老狗提测之后,测试小姐姐也没测出问题,一切都是......
  • void随笔
    void不能用于声明变量。不能对void*指针直接解引用(需要转换成其他类型的指针)。把其他类型的值赋给void*指针不需要转换。把void*类型指针赋给其他变量指针需要转换。voidfunc(stringvarname,void*p){ cout<<varname<<"的地址是"<<p<<endl; cout<<varname<......
  • 自签名证书--x509: certificate signed by unknown authority
    问题描述: 后端日志报错:x509:certificatesignedbyunknownauthority登陆pod测试: 原因:因为自签名证书,不能识别到根证书解决:1.临时办法把根证书复制到podkubectlcp **.crt/usr/local/share/ca-certificates/kubectlexec-it** -- update-ca-certificates......
  • progs/verifier_netfilter_retcode.c:42:1: error: unknown attribute 'btf_decl_tag'
    平台ubuntu20.04问题在linux内核源码目录下执行下面的命令时:root@ubuntu-vm:/mnt/linux-6.5/tools/testing/selftests/bpf#make报如下错误:progs/verifier_netfilter_retcode.c:41:1:error:unknownattribute'btf_decl_tag'ignored[-Werror,-Wunknown-attributes]__d......
  • Unknown collation: 'utf8_0900_ai_ci' 的解决方法
    Unknowncollation:'utf8_0900_ai_ci'解决方法Unknowncollation:'utf8_0900_ai_ci'在使用Navicat导入sql脚本的时候出现报错Unknowncollation:'utf8_0900_ai_ci'原因:当前要导入的sql版本高于目标sql版本,导致的不兼容问题解决方法:使用编辑器打开sql文件全局替换utf8......
  • Go - Avoiding Test Fixtures in Performance Tests
    Problem: Youwanttocustomizetheperformanceteststoavoidbenchmarkingtestfixtures.Solution: Youcanstart,stop,andresetthebenchmarktimersusingtheStartTimer,StopTimer,andResetTimer,respectively.Thiswillallowyoutheflexibilityt......
  • 用友U8 同步许可提示failed 1091,sync license unknown error?
    软件版本:用友U816.5问题:许可管理--导入许可--在线同步许可报错解决办法:服务器上面找到U8的应用服务器,停止所有的U8服务;将软件安装目录/U8SOFT/SoftSeccurity/data中的.temp文件剪切放到其他的文件下做并备份;重新启动U8服务;打开许可管理--导入许可---重新导入许可文件,重新......
  • Argument for '--moduleResolution' option must be: 'node', Unknown compiler opt
    node_modules/@vue/tsconfig/tsconfig.json(12,25):errorTS6046:Argumentfor'--moduleResolution'optionmustbe:'node','classic','node16','nodenext'.node_modules/@vue/tsconfig/tsconfig.json(33,5):erro......
  • Codeforces Global Round 11 A. Avoiding Zero
    给一个大小为\(n\)的数组\(a_1,a_2,\cdots,a_n\)。你需要构造一个大小为\(n\)的数组\(b\)且满足以下条件:数组\(b\)是数组\(a\)的冲排列对于\(\forallk=1,2,\cdots,n\),\(\sum_{i=1}^{k}b_i\neq0\)。输出任意一组构造,或者回答不可能。若\(\sum_{i......
  • 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 _main
    问题描述按照思路写好了C++的程序之后,表面上看起来没什么错误,也没有红点点的出现,但是运行起来,就发现,爆出来这样一个错误:问题解决看了半天,查了半天资料,发现是这里出现了问题(我真的~~~):习惯了首字母大写,这个就当成类来写了,后来突然醒悟,这个是main函数,首字母是要小写:运行成功......