typescript 解决变量多类型访问属性报错--工作随记

typescript,解决,变量,类型,访问,属性,报错,工作,随记 · 浏览次数 : 40

小编点评

**变量类型允许是多个类型** 如果访问某个类型的属性,编辑器会直接提示错误。例如,变量 `tuple` 的类型是 `(string | number)[]`,如果直接访问 `tuple.toFixed` 属性,编辑器会提示错误: ``` Property 'toFixed' does not exist on type 'string | number' ``` **解决方法:** 1. **使用 `typeof` 判断类型** 使用 `typeof` 运算符判断 `tuple` 的类型,然后访问属性。例如,可以使用 `if (typeof tuple === 'number')` 来只处理 `number` 类型。 2. **使用 `instanceof` 运算符** 使用 `instanceof` 运算符检查 `classItem` 是否实例化自 `Dog` 类。例如,可以使用 `if (classItem instanceof Dog)` 来只处理 `Dog` 类实例。 **示例:** ```javascript const mixedClassTypeArray: (Animal | Dog)[] = [animal, dog]; // 使用 typeof 判断类型 if (typeof tuple === 'number') { tuple.toFixed(); // 只处理 number 类型 } // 使用 instanceof 判断实例化自 Dog 类 if (classItem instanceof Dog) { classItem.speak(); // 只处理 Dog 类实例 } ```

正文

一个变量类型允许是多个类型,如果访问某个类型的属性,编辑器会直接提示错误

比如 变量 tuple 可能为string 或 number 类型,如果直接访问tuple.toFixed

const mixedTupleTypeArray: (string|number)[] = ['hello', 2333]
const tuple = mixedTupleTypeArray[0];
// tuple 类型有可能是 string 或 number
// 编辑器会提示错误,Property 'toFixed' does not exist on type 'string | number'
if(tuple.toFixed){

}

即使加?操作符也不行,还是会提示错误

tuple?.toFixed

解决方法: typeof 判断类型后再访问,如下所示

if(typeof tuple === 'number'){
    tuple.toFixed
}
if(typeof tuple === 'string'){
    tuple.substring
}

如果是 class 类相关的继承模式呢?

比如

class Animal{

}

class Dog extends Animal{
    constructor(){
        super();
    }
    speak(){
        console.log('汪')
    }
}

const animal = new Animal();
const dog = new Dog();

const mixedClassTypeArray: (Animal|Dog)[] = [animal, dog];
const classItem = mixedClassTypeArray[0]
// 报错 Property 'speak' does not exist on type 'Animal | Dog'.
if(classItem.speak){

}

直接使用 classItem.speak 编辑器提示错误 Property 'speak' does not exist on type 'Animal | Dog'

两种写法可以解决

方法一
用 as 强行告诉编译器,classItem 属于 Dog 类

if((classItem as Dog)?.speak){

}

方法二
用 instanceof 判断实例化自哪里

if(classItem instanceof Dog){
    classItem.speak
}


转载入注明博客园池中物 willian12345@126.com sheldon.wang

github: https://github.com/willian12345

与typescript 解决变量多类型访问属性报错--工作随记相似的内容:

typescript 解决变量多类型访问属性报错--工作随记

一个变量类型允许是多个类型,如果访问某个类型的属性,编辑器会直接提示错误 比如 变量 tuple 可能为string 或 number 类型,如果直接访问tuple.toFixed const mixedTupleTypeArray: (string|number)[] = ['hello', 23

为什么我反对过度使用TypeScript?

大家好, 我前夕. TypeScript在今天早已无人不知, 但是我认为TypeScript的使用应该遵循中庸之道. 要使用, 但不要过度使用.

TypeScript入门介绍

目录TypeScript入门介绍什么是 TypeScript?发展历史优缺点应用场景开发工具环境依赖编程IDEvs调试构建工具/工程化步骤汇总第一个项目 TypeScript入门介绍 什么是 TypeScript? 1.1 TypeScript 是由微软开发的一种开源的编程语言。它是 JavaScr

TypeScript数据类型

目录TypeScript数据类型基础数据类型number、string、boolean、 null 和 undefined、object其他数据类型元组 []枚举 enum接口 interface联合类型 |交叉类型 &type声明面向对象类class继承extends其他类型推断类型断言 as总结

Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧

实际项目中会运到的 Typescript 回调函数、事件侦听的类型定义,如果刚碰到会一脸蒙真的,我就是 这是第一次我自己对 Typescript 记录学习,所以得先说一下我与 Typescript 的孽缘 记得最早是在2014年遇上 Typescript 当时是完全看不上这东西的,甚至带着鄙视的心态

TypeScript 前端工程最佳实践

作者:王春雨 前言 随着前端工程化的快速发展, TypeScript 变得越来越受欢迎,它已经成为前端开发人员必备技能。 TypeScript 最初是由微软开发并开源的一种编程语言,自2012年10月发布首个公开版本以来,它已得到了人们的广泛认可。TypeScript 发展至今,已经成为很多大型项目

typescript的必要性及使用

作为一个前端语言,Javascript从最初只是用来写页面,到如今的移动终端、后端服务、神经网络等等,它变得几乎无处不在。如此广阔的应用领域,对语言的安全性、健壮性以及可维护性都有了更高的要求。尽管ECMAScript标准在近几年有了长足的进步,但是在类型检查方面依然毫无建树。在这种情况下TypeScript应运而生。

TypeScript又出新关键字了?

TypeScript 5.2将引入一个新的关键字:`using`。当它离开作用域时,你可以用`Symbol.dispose`函数来处置任何东西。 ```jsx { const getResource = () => { return { [Symbol.dispose]: () => { conso

如何发布一个 TypeScript 编写的 npm 包

前言 在这篇文章中,我们将使用TypeScript和Jest从头开始构建和发布一个NPM包。 我们将初始化一个项目,设置TypeScript,用Jest编写测试,并将其发布到NPM。 项目 我们的库称为digx。它允许从嵌套对象中根据路径找出值,类似于lodash中的get函数。 比如说: cons

有JSDoc还需要TypeScript吗

这听起来是不是很耳熟:你想写一个小型脚本,不管是为页面、命令行工具,还是其他什么类型。你从JavaScript开始,直到你想起写代码时没有类型是多么痛苦。所以你把文件从`.js`重命名为`.ts`。然后意识到你已经打开了一个麻烦的玩意儿。 如果你在为一个网站或一个库写代码,你就需要引入编译的步骤。如