首页 web前端 js教程 TypeScript:JavaScript 的超级英雄斗篷

TypeScript:JavaScript 的超级英雄斗篷

Oct 27, 2024 pm 08:45 PM

TypeScript: JavaScript

为什么要向 JavaScript 添加类型?

想象一下:您正在愉快地使用 JavaScript 进行编码,突然出现“无法读取未定义的属性‘名称’”。呃,我们都去过那里! TypeScript 就像有一个朋友,可以在这些错误发生之前发现它们。

起源故事

JavaScript 就像被蜘蛛咬之前的彼得·帕克 - 潜力巨大,但容易发生意外。 TypeScript 是赋予 JavaScript 超能力的蜘蛛咬伤。它添加了一个类型系统,有助于及早发现错误并使您的代码更加可靠。

你的第一次 TypeScript 冒险

让我们从一个简单的 JavaScript 函数开始,并将其转换为 TypeScript:

1

2

3

4

// JavaScript

function greet(name) {

    return "Hello, " + name + "!";

}

登录后复制

现在,让我们添加一些 TypeScript 魔法:

1

2

3

4

// TypeScript

function greet(name: string): string {

    return "Hello, " + name + "!";

}

登录后复制

看到那个:字符串吗? TypeScript 告诉我们“这个函数接受一个字符串并返回一个字符串”。现在试试这个:

1

greet(123); // Error: Argument of type 'number' is not assignable to parameter of type 'string'

登录后复制

TypeScript 刚刚让我们避免了潜在的错误! ?

基本类型:你的新超能力

让我们探索一些基本的 TypeScript 类型:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// Basic types

let heroName: string = "Spider-Man";

let age: number = 25;

let isAvenger: boolean = true;

let powers: string[] = ["web-slinging", "wall-crawling"];

 

// Object type

let hero: {

    name: string;

    age: number;

    powers: string[];

} = {

    name: "Spider-Man",

    age: 25,

    powers: ["web-slinging", "wall-crawling"]

};

登录后复制

接口:创建您自己的类型

界面就像对象的蓝图。它们对于定义数据的形状非常有用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

interface Hero {

    name: string;

    age: number;

    powers: string[];

    catchPhrase?: string; // Optional property

}

 

function introduceHero(hero: Hero): void {

    console.log(`I am ${hero.name}, and I'm ${hero.age} years old!`);

    if (hero.catchPhrase) {

        console.log(hero.catchPhrase);

    }

}

 

const spiderMan: Hero = {

    name: "Spider-Man",

    age: 25,

    powers: ["web-slinging", "wall-crawling"]

};

 

introduceHero(spiderMan);

登录后复制

类型别名:您的自定义类型

有时您想创建自己的类型组合:

1

2

3

4

5

6

7

8

9

10

11

type PowerLevel = 'rookie' | 'intermediate' | 'expert';

 

interface Hero {

    name: string;

    powerLevel: PowerLevel;

}

 

const batman: Hero = {

    name: "Batman",

    powerLevel: "expert" // TypeScript will ensure this is one of the allowed values

};

登录后复制

泛型:终极灵活性

泛型就像通配符,使您的代码更可重用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

function createHeroTeam<T>(members: T[]): T[] {

    return [...members];

}

 

interface Superhero {

    name: string;

    power: string;

}

 

interface Villain {

    name: string;

    evilPlan: string;

}

 

const heroes = createHeroTeam<Superhero>([

    { name: "Iron Man", power: "Technology" },

    { name: "Thor", power: "Lightning" }

]);

 

const villains = createHeroTeam<Villain>([

    { name: "Thanos", evilPlan: "Collect infinity stones" }

]);

登录后复制

真实示例:Todo 应用程序

让我们使用 TypeScript 构建一个简单的待办事项应用程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

interface Todo {

    id: number;

    title: string;

    completed: boolean;

    dueDate?: Date;

}

 

class TodoList {

    private todos: Todo[] = [];

 

    addTodo(title: string, dueDate?: Date): void {

        const todo: Todo = {

            id: Date.now(),

            title,

            completed: false,

            dueDate

        };

        this.todos.push(todo);

    }

 

    toggleTodo(id: number): void {

        const todo = this.todos.find(t => t.id === id);

        if (todo) {

            todo.completed = !todo.completed;

        }

    }

 

    getTodos(): Todo[] {

        return this.todos;

    }

}

 

// Usage

const myTodos = new TodoList();

myTodos.addTodo("Learn TypeScript with baransel.dev");

myTodos.addTodo("Build awesome apps", new Date("2024-10-24"));

登录后复制

TypeScript 与 React

TypeScript 和 React 就像花生酱和果冻。这是一个简单的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

interface Props {

    name: string;

    age: number;

    onSuperPower?: () => void;

}

 

const HeroCard: React.FC<Props> = ({ name, age, onSuperPower }) => {

    return (

        <div>

            <h2>{name}</h2>

            <p>Age: {age}</p>

            {onSuperPower && (

                <button onClick={onSuperPower}>

                    Activate Super Power!

                </button>

            )}

        </div>

    );

};

登录后复制

提示和技巧

  1. 从简单开始:从基本类型开始,逐渐添加更复杂的类型。
  2. 使用编译器:TypeScript 的编译器是你的朋友 - 注意它的错误。
  3. 不要过度输入:有时任何都可以(但要谨慎使用!)。
  4. 启用严格模式:将 "strict": true 添加到您的 tsconfig.json 中以获得最大程度的保护。

常见问题及解决方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// Problem: Object is possibly 'undefined'

const user = users.find(u => u.id === 123);

console.log(user.name); // Error!

 

// Solution: Optional chaining

console.log(user?.name);

 

// Problem: Type assertions

const input = document.getElementById('myInput'); // Type: HTMLElement | null

const value = input.value; // Error!

 

// Solution: Type assertion or type guard

const value = (input as HTMLInputElement).value;

// or

if (input instanceof HTMLInputElement) {

    const value = input.value;

}

登录后复制

总结

TypeScript 乍一看似乎是额外的工作,但它就像拥有一种超能力,可以帮助您在错误发生之前捕获它们。从小处开始,逐渐添加更多类型,在您意识到之前,您会想知道没有它您是如何生活的!

记住:

  • 类型是你的朋友
  • 编译器是你的助手
  • 熟能生巧

以上是TypeScript:JavaScript 的超级英雄斗篷的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在JavaScript中替换字符串字符 在JavaScript中替换字符串字符 Mar 11, 2025 am 12:07 AM

在JavaScript中替换字符串字符

jQuery检查日期是否有效 jQuery检查日期是否有效 Mar 01, 2025 am 08:51 AM

jQuery检查日期是否有效

jQuery获取元素填充/保证金 jQuery获取元素填充/保证金 Mar 01, 2025 am 08:53 AM

jQuery获取元素填充/保证金

10个jQuery手风琴选项卡 10个jQuery手风琴选项卡 Mar 01, 2025 am 01:34 AM

10个jQuery手风琴选项卡

10值得检查jQuery插件 10值得检查jQuery插件 Mar 01, 2025 am 01:29 AM

10值得检查jQuery插件

HTTP与节点和HTTP-Console调试 HTTP与节点和HTTP-Console调试 Mar 01, 2025 am 01:37 AM

HTTP与节点和HTTP-Console调试

jQuery添加卷轴到Div jQuery添加卷轴到Div Mar 01, 2025 am 01:30 AM

jQuery添加卷轴到Div

自定义Google搜索API设置教程 自定义Google搜索API设置教程 Mar 04, 2025 am 01:06 AM

自定义Google搜索API设置教程

See all articles