ReactJS中使用TypeScript

server/2024/9/24 7:54:54/

TypeScript

TypeScript 实际上就是具有强类型的 JavaScript,可以对类型进行强校验,好处是代码阅读起来比较清晰,代码类型出现问题时,在编译时就可以发现,而不会在运行时由于类型的错误而导致报错。但是,从某种程度说TypeScript 失去了 JavaScript 动态语言的灵活性,代码写起来也会比较繁琐,需要生命类型。

主要语法

首先,TypeScript 支持 JavaScript基本写法,主要特性是加了类型,主要看下相对于 JavaScript 比较特殊的几种写法。

参数加类型

主流的强类型语言在函数中都是要定义参数类型的,如下,useName 的类型是字符串。

function greet(userName: string): string {return `Hello, ${user.name}! You are ${user.age} years old.`;
}
Type 和 Interface

Type主要用于定义类型。Interface 主要用于定义接口,Interface 可以被扩展、可以被类继承。语法上 Type 和 Interface 可以互换,都可以仅当类型试用。但是,项目开发中,尽量不要混用,定义类型时就用 Type,定义接口时就用 Interface。

  1. Type 试用方法
type Animal = {name: string;species: string;
};type Loggable = {log(): void;
};type LoggableAnimal = Animal & Loggable; //合并const dog: LoggableAnimal = {name: "Buddy",species: "Canine",log() {console.log(`${this.name} is a ${this.species}`);}
};
  1. Interface 试用方法
interface Person {name: string;age: number;introduce(): string;
}class Student implements Person {name: string;age: number;course: string;constructor(name: string, age: number, course: string) {this.name = name;this.age = age;this.course = course;}introduce(): string {return `Hi, I'm ${this.name}, and I'm ${this.age} years old. I study ${this.course}.`;}
}

泛型

泛型是 TypeScript 非常重要的概念,在 React 中使用非常多。什么是泛型,简单理解就是类型参数化,例如在 Animal 类中,有一个animal 属性,这个属性可以是 Cat或者Dog,不用泛型的话,可能要定义多个类,当然也可以使用接口或者父类进行抽象。有了泛型,只要通过泛型传递就可以了。

class Animal<T> {name: string; // Regular property for the animal's nameanimation: T;  // Generic property for the animal's animationconstructor(name: string, animation: T) {this.name = name;this.animation = animation;}animate(): void {console.log(`The ${this.name} starts to: ${this.animation}`);}
}

TypeScript 中方法和类型也可以试用泛型。

#方法泛型
function createPair<S, T>(v1: S, v2: T): [S, T] {return [v1, v2];
}
console.log(createPair<string, number>('hello', 42)); // ['hello', 42]#类型泛型
type Wrapped<T> = { value: T };const wrappedValue: Wrapped<number> = { value: 10 };

TypeScript 上手很快难度不大,做个基本了解,就可以开始使用了,就是写起来麻烦一些。

React 中使用 TypeScript

在 React 中使用 TypeScript 最重要的就是类型,例如,props 都有什么字段,字段都是什么类型。只要是在Typescript 中出现的对象,就必要有对应的类型,TypeScript 中如果不指定类型,如果是简单类型可以自动解析,如果是函数参数默认为 Any。

  1. 代码中{ title: string } 是行内类型
function MyButton({ title }: { title: string }) {return (<button>{title}</button>);
}export default function MyApp() {return (<div><h1>Welcome to my app</h1><MyButton title="I'm a button" /></div>);
}
  1. MyButtonProps 是单独定义的类型
interface MyButtonProps {/** The text to display inside the button */title: string;/** Whether the button can be interacted with */disabled: boolean;
}function MyButton({ title, disabled }: MyButtonProps) {return (<button disabled={disabled}>{title}</button>);
}

Hooks

React hooks 使用 TypeScript 主要用到的就是泛型,例如,useState

#自动解析为 bool
const [enabled, setEnabled] = useState(false);#指定类型为Status
type Status = "idle" | "loading" | "success" | "error";
const [status, setStatus] = useState<Status>("idle");

Dom Event

DomEvent 是转换到 TypeScript 之后比较难上手的,需要熟悉一下 React 的类型定义。这个有个办法就是通过 inline 方法,然后VsCode 会给你提示。

export default function Form() {const [value, setValue] = useState("Change me");function handleChange(event: React.ChangeEvent<HTMLInputElement>) {setValue(event.currentTarget.value);}return (<><input value={value} onChange={handleChange} /><p>Value: {value}</p></>);
}

直接复制事件类型就可以。
在这里插入图片描述
个人觉得 TypeScript 虽然现在都在推广,但是确实失去了JavaScript 的灵活性和动态性,开销效率降低不少,如果做的是类库,还要有类型定义文件,看个人喜好和项目需求吧。


http://www.ppmy.cn/server/20362.html

相关文章

GateWay具体的使用之局部过滤器接口耗时

1.找规律 局部过滤器命名规则 XXXGatewayFilterFactory&#xff0c; 必须以GatewayFilterFactory结尾。 /* 注意名称约定 * AddRequestHeaderGatewayFilterFactory 配置的时候写的是 AddRequestHeader * AddRequestParameterGatewayFilterFactory 配置的时候写的是 A…

day04--react中state的简化

一、简化state 回顾我们之前的写法&#xff1a; state是在构造器里面定义的。 1&#xff09;我们为什么要在构造器里面定义&#xff1f; 答&#xff1a;对于创建一个实例对象时&#xff0c;我们对要传进来的数据进行接收&#xff0c;那么我们必须要写一个构造器来接收传进来的…

GCC编译器介绍及编译流程说明

一、计算机基础 1、冯诺依曼模型 1945年冯诺依曼和一些科学家提出了一份报告,报告遵循了图灵机的设计&#xff0c;并提出用电子元件构造计算机&#xff0c;约定了用二进制进行计算和存储&#xff0c;并且将计算机结构分成运算器&#xff0c;控制器、存储器、输入设备、输出设备…

旅游网站制作流程

旅游网站制作流程是一个较复杂的过程&#xff0c;因为它需要结合市场调研、用户需求、内容构建、技术开发等多个方面。在这篇文章中&#xff0c;我将简单介绍一下旅游网站的制作流程&#xff0c;大致分为以下步骤。 第一步&#xff1a;市场调研 在制作旅游网站前&#xff0c;我…

数据结构:实验六:图的操作

一、 实验目的 &#xff08;1&#xff09;掌握图的邻接矩阵和邻接表存储结构。 &#xff08;2&#xff09;熟练图的邻接表的基本运算。 &#xff08;3&#xff09;加深图的深度优先遍历算法和广度优先遍历算法的理解 二、 实验要求 有下图所示的带权有向图及其对应的邻…

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(十)

探索和构建 LLaMA 3 架构&#xff1a;深入探讨组件、编码和推理技术&#xff08;十&#xff09; Llama 推理 为了对模型进行推理&#xff0c; 需要从Meta的LLaMA 3仓库下载模型的权重。 编写模型推理的代码。在推理模型时&#xff0c;有许多可调参数需要考虑&#xff0c;包括…

MySQL数据库安装——zip压缩包形式

安装压缩包zip形式的 MySQL 8数据库 一 、先进入官网下载 https://dev.mysql.com/downloads/mysql/ 二、解压到某个文件夹 我解压到了D:\mysql\mysql8 下面 然后在这个文件夹下手动创建 my.ini 文件和 data 文件夹 my.ini 内容如下&#xff1a; 注意 basedir 和 datadi…

【机器学习原理】决策树从原理到实践

基于树的模型是机器学习中非常重要的一类模型&#xff0c;最基础的就是决策树&#xff0c;本篇主要讲述决策树的原理和几类最常见的决策树算法&#xff0c;这也是更复杂的树模型算法的基础。 参考文章&#xff1a; 1.CSDN-基于熵的两个模型(ID3,C4.5)比较详细&#xff0c;有数字…