当前位置: 首页 > 科技观察

TypeScript中的感叹号,你知道吗?

时间:2023-03-16 13:40:52 科技观察

TypeScript中的感叹号(!)操作符可以让编译器忽略一些错误。让我们来看看感叹号运算符有哪些实际用途以及何时使用它。1.非空断言运算符感叹号运算符称为非空断言运算符。添加此运算符将导致编译器忽略未定义和空类型。看例子:constparseValue=(value:string)=>{//...};constprepareValue=(value?:string)=>{//...parseValue(value);};对于prepareValue方法值参数,TypeScript会报如下错误:Aparameteroftype"string|undefined"cannotbeassignedtoaparameteroftype"string"。类型“undefined”不可分配给类型“string”。'string|类型的参数undefined'不可分配给'string'类型的参数。类型“undefined”不可分配给类型“string”。因为我们期望prepareValue函数中的值是undefined或者string,但是我们把它传给了parseValue函数,它只能取字符串。所以我报了这个错误。但是,在某些情况下我们可以确定值不会未定义,这就是需要非空断言运算符的情况:constparseValue=(value:string)=>{//...};constprepareValue=(value?:string)=>{//...parseValue(value!);};这样就不会报错了。但是在使用的时候要非常小心,如果value的值是undefined的话,可能会导致意想不到的错误。2.使用示例既然您知道了非空断言运算符,让我们来看几个真实的示例。在列表中搜索一个项目:interfaceConfig{id:number;路径:字符串;}constconfigs:Config[]=[{id:1,path:"path/to/config/1",},{id:2,path:"path/to/config/2",},];constgetConfig=(id:number)=>{返回配置。find((config)=>config.id===id);};常量配置=getConfig(1);由于搜索到的内容不一定存在于列表中,因此config变量的类型为Config|undefined,我们可以使用成本控制断言运算符来告诉TypeScript配置应该存在,因此不必假定它是未定义的。constgetConfig=(id:number)=>{returnconfigs.find((config)=>config.id===id)!;};常量配置=getConfig(1);此时配置变量的类型为Config。此时从config中获取任何属性时,不需要检查它是否存在。让我们看另一个例子。React中的Refs提供了一种访问DOM节点或React元素的方法:constApp=()=>{constref=useRef(null);consthandleClick=()=>{if(ref.current){console.log(ref.current.getBoundingClientRect());}};return(点击

);};这里创建了一个简单的组件,可以访问类为App的DOM节点。该组件有一个按钮,单击该按钮会显示元素的大小及其在视口中的位置。我们可以确定点击按钮后访问的元素被挂载,所以我们可以在TypeScript中添加一个非空断言操作符来表明这个元素必须存在:constApp=()=>{consthandleClick=()=>{console.log(ref.current!.getBoundingClientRect());};};当使用非空断言运算符时,意味着告诉TypeScript我比你更了解代码逻辑并且会对此负责,所以我们需要在你完全理解你的代码之后才使用这个运算符。否则,如果断言由于某种原因不正确,则会发生运行时错误。