iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >TypeScript类型级别和值级别如何区分
  • 389
分享到

TypeScript类型级别和值级别如何区分

2023-07-05 07:07:23 389人浏览 安东尼
摘要

这篇文章主要介绍“typescript类型级别和值级别如何区分”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript类型级别和值级别如何区分”文章能帮助大家解决问题。对值级别编程类型级别

这篇文章主要介绍“typescript类型级别和值级别如何区分”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript类型级别和值级别如何区分”文章能帮助大家解决问题。

对值级别编程类型级别编程区分

首先,让我们对值级别编程和类型级别编程进行重要区分。

  • 值级别编程让我们编写将在生产中运行的代码即运行期,并为我们的用户提供有用的东西。

  • 类型级别编程帮助我们确保代码在发布之前即编译期不包含错误,在运行期会被完全删除

javascript没有类型,所以所有JavaScript都是值级别的代码:

// A simple Javascript function:function sum(a, b) {  return a + b;}

TypeScript允许我们将类型注释添加到JavaScript中,并确保我们编写的sum函数永远不会用数字以外的任何东西调用:

// Using type annotations:function sum(a: number, b: number): number {  return a + b;}

但TypeScript的类型系统远比这强大得多。我们编写的真实代码有时需要是通用的,并接受我们事先不知道的类型。

在这种情况下,我们可以在尖括号<A,B,&hellip;>中定义类型参数然后,我们可以将类型参数传递给一个类型级函数,该函数根据输入类型计算输出类型:

// Using type level programming:function genericFunction<A, B>(a: A, b: B): DoSomething<A, B> {  return doSomething(a, b);}

这就是类型级编程!DoSomething<A,B> 是一种用特殊编程语言编写的类型级函数,它与我们用于值的语言不同,但同样强大。让我们将这种语言称为类型级TypeScript。

// This is a type-level function:type DoSomething<A, B> = ...// This is a value-level function:const doSomething = (a, b) => ...

类型级编程

类型级TypeScript是一种最小的纯函数语言。

在类型级别,函数被称为泛型类型:它们接受一个或多个类型参数并返回单个输出类型。下面是一个函数的简单示例,该函数使用两个类型参数并将它们包装在元组中:

type SomeFunction<A, B> = [A, B];

类型级别的TypeScript没有很多功能。毕竟,它是专门为你的代码做类型约束的!也就是说,它确实有足够的特性(几乎)图灵完备,这意味着你可以用它解决任意复杂的问题。

  • 代码分支:根据条件执行不同的代码路径(相当于值级别if/else关键字)。

  • 变量赋值:声明一个变量并在表达式中使用它(相当于值级别var/let关键字)。

  • 函数:可重复使用的逻辑单位,如我们在前面的示例中看到的。

  • 循环:通常通过递归

  • 相等检查:==但适用于类型!

  • 还有更多!

这是我们将在接下来的章节中学习的语言类型的简要概述。现在,让我们开始第一次挑战吧!

挑战是如何工作的

在每一章结束时,你将有一些挑战需要解决,以将你的新技能付诸实践。它们看起来像这样:

namespace challenge {  // 1. implement a generic to get the uNIOn  // of all keys in an object type.  type GetAllKeys<Obj> = TODO;  type res1 = GetAllKeys<{ a: number }>;  type test1 = Expect<Equal<res1, "a">>;}
  • namespace 是一个鲜为人知的TypeScript功能,它可以让我们在专用范围内隔离每个挑战。

  • TODO 是占位符。这是您需要更换的!

  • res1=。。。 是泛型为某些输入类型返回的类型。您可以用鼠标将其悬停以检查其当前

  • type test1=Expect<Equal<res1,&hellip;>> 是类型级单元测试。用于判断TODO部分的代码是否正确

在此之前你要先定义好Expect和Equal

type Expect<T extends true> = T;type Equal<X, Y> = (<T>() => T extends { [k in keyof X]: X[k]; } ? 1 : 2) extends <T>() => T extends { [k in keyof Y]: Y[k]; } ? 1 : 2 ? true : false;

挑战

准备好迎接你的第一个挑战了吗?出发:

namespace genericFunction {  function identity(a: TODO): TODO {    return a;  }  let input1 = 10;  let res1 = identity(input1);  type test1 = Expect<Equal<typeof res1, number>>;  let input2 = "Hello";  let res2 = identity(input2);  type test2 = Expect<Equal<typeof res2, string>>;}
namespace safeHead {  function safeHead(array: TODO[], defaultValue: TODO): TODO {    return array[0] ?? defaultValue;  }  let input1 = [1, 2, 3];  let res1 = safeHead(input1, 0);  type test1 = Expect<Equal<typeof res1, number>>;  let input2 = ["Hello", "Hola", "Bonjour"];  let res2 = safeHead(input2, "Hi");  type test2 = Expect<Equal<typeof res2, string>>;}
namespace map {  function map(array: TODO[], fn: (value: TODO) => TODO): TODO[] {    return array.map(fn);  }  let input1 = [1, 2, 3];  let res1 = map(input1, value => value.toString());  type test1 = Expect<Equal<typeof res1, string[]>>;  let input2 = ["Hello", "Hola", "Bonjour"];  let res2 = map(input2, str => str.length);  type test2 = Expect<Equal<typeof res2, number[]>>;}
namespace pipe2 {  function pipe2(    x: TODO,    f1: (value: TODO) => TODO,    f2: (value: TODO) => TODO  ): TODO {    return f2(f1(x));  }  let res1 = pipe2(    [1, 2, 3],    arr => arr.length,    length => `length: ${length}`  );  type test1 = Expect<Equal<typeof res1, string>>;  let res2 = pipe2(    { name: 'Alice' },    user => user.name,    name => name.length > 5  );  type test2 = Expect<Equal<typeof res2, boolean>>;}

关于“TypeScript类型级别和值级别如何区分”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: TypeScript类型级别和值级别如何区分

本文链接: https://www.lsjlt.com/news/350149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TypeScript类型级别和值级别如何区分
    这篇文章主要介绍“TypeScript类型级别和值级别如何区分”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript类型级别和值级别如何区分”文章能帮助大家解决问题。对值级别编程类型级别...
    99+
    2023-07-05
  • TypeScript类型级别和值级别示例详解
    目录对值级别编程类型级别编程区分类型级编程挑战是如何工作的挑战对值级别编程类型级别编程区分 首先,让我们对值级别编程和类型级别编程进行重要区分。 值级别编程让我们编写将在生产中运行...
    99+
    2023-02-27
    TypeScript类型级别值级别 TypeScript 级别
  • TypeScript类型级别实例代码分析
    本篇内容介绍了“TypeScript类型级别实例代码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:type Hell...
    99+
    2023-07-05
  • TypeScript 类型级别示例介绍
    介绍 这是一门在线课程,旨在将您的TypeScript技能从中级提升到高级。它将使你深入了解类型系统的基本原理,并指导你完成其高级功能。在这里,你会找到成为TypeScript专家...
    99+
    2023-02-27
    TypeScript 类型级别 TypeScript 类型
  • TypeScript接口和类型的区别小结
    目录接口(interface)类型(type)interface vs type结论TypeScript 是由 Microsoft 开发的一种开源的编程语言。它是 JavaScrip...
    99+
    2023-05-20
    TypeScript接口和类型区别 TypeScript 接口 类型
  • TypeScript接口和类型有哪些区别
    今天小编给大家分享的是TypeScript接口和类型有哪些区别,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录接口(interface)类型(type)interface vs t...
    99+
    2023-07-06
  • TypeScript类型anynevervoid和unknown使用场景区别
    目录前言any用法使用场景unknown用法使用场景never用法使用场景void用法使用场景总结前言 不知道初学TypeScript的同学会不会和我一样被any,unknown,n...
    99+
    2024-04-02
  • C#中值类型和引用类型的区别
    一、值类型和引用类型的区别 .NET的类型可以分为两类:值类型和引用类型。这两种类型各有特点,即使它们都继承自System.Object,并且有装箱和拆箱等操作确保两种类型可以方便地...
    99+
    2024-04-02
  • TypeScript如何使用类型别名
    这篇文章主要介绍了TypeScript如何使用类型别名,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类型别名类型别名会给一个类型起个新名字,...
    99+
    2024-04-02
  • C#中引用类型和值类型有什么区别
    在C#中,引用类型和值类型是两种不同的数据类型。 值类型是直接存储在堆栈中的数据,它们保存的是实际的数据值。当值类型的变量被赋值给另...
    99+
    2024-03-07
    C#
  • js中值类型和引用类型的区别介绍
    1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null ...
    99+
    2024-04-02
  • js中值类型和引用类型的区别是什么
    这篇文章主要介绍“js中值类型和引用类型的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js中值类型和引用类型的区别是什么”文章能帮助大家解决问题。1.JavaScript中的变量类型有哪...
    99+
    2023-07-02
  • 如何在Golang 中区分类型别名与类型定义
    这篇文章将为大家详细讲解有关如何在Golang 中区分类型别名与类型定义,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。golang适合做什么golang可以做服务器端开发,但golang很适...
    99+
    2023-06-06
  • 发烧级显卡和高性能级显卡区别
    发烧级显卡和高性能级显卡区别有:1、发烧级显卡价格比较贵,而高性能级显卡价格相对便宜;2、发烧级显卡采用最先进的芯片和技术,而高性能级显卡通常配备中高端芯片和技术;3、发烧级显卡在散热和供电方面更加考究,而高性能级显卡的散热和供电系统相对简...
    99+
    2023-07-10
  • Mybatis 一级缓存和二级缓存原理区别
    目录Mybatis缓存Mybatis一级缓存1.为什么需要Mybatis一级缓存2.Mybatis一级缓存的实现3.Mybatis一级缓存配置Mybatis二级缓存1.为什么需要My...
    99+
    2024-04-02
  • c#引用类型与值类型的区别是什么
    这篇文章主要讲解了“c#引用类型与值类型的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c#引用类型与值类型的区别是什么”吧!解析:CLR支持两种类型:值类型和引用类型。用Jeff...
    99+
    2023-06-17
  • CSS中block级和inline级对象的区别是什么
    这篇文章将为大家详细讲解有关CSS中block级和inline级对象的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。CSS中block级和inli...
    99+
    2024-04-02
  • C#基础入门之值类型和引用类型的区别详析
    目录一、值类型和引用类型的区别 1、赋值时的区别 2、内存分配的区别 3、来自继承结构的区别 二、总结 一、值类型和引用类型的区别 .NET的类型可以分为两类:值类型和引用类型。这...
    99+
    2024-04-02
  • mybatis一级缓存和二级缓存有什么区别
    MyBatis的一级缓存和二级缓存是两种不同级别的缓存机制。一级缓存是在同一个SqlSession内部的缓存,它默认是开启的。在执行...
    99+
    2023-08-20
    mybatis
  • C++11类型别名和typedef有什么区别
    这篇文章主要讲解了“C++11类型别名和typedef有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11类型别名和typedef有什么区别”吧!为什么需要别名下面的说明只是一...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作