TypeScript基本类型之typeof和keyof详解

TypeScript基本类型之typeof和keyof详解

在TypeScript中,typeof和keyof是两个非常重要的基本类型运算符。typeof可用于获取变量的类型,而keyof可用于获取对象类型的键类型。

typeof

typeof可用于获取变量的类型,其语法为:

typeof x

这里的x可以是任意类型的变量、对象或函数,返回结果为x的类型。

示例1

let x = 10;
let y: typeof x = 20;
console.log(y); //20

在上面的例子中,我们定义了变量x,并将其赋值为10。然后我们定义变量y,并将其类型设为typeof x。这时,y的类型就会被自动推导为number,因为x是一个number类型的变量。

示例2

function foo(x: string): string {
  return x + '!';
}

let y: typeof foo = (x: string): string => {
  return x + '?';
}

console.log(foo('hello')); //hello!
console.log(y('hello')); //hello?

在上面的例子中,我们定义了函数foo,并将其类型设为(x: string) => string,即一个接收一个string类型参数并返回一个string类型结果的函数。

然后我们定义变量y,并将其类型设为typeof foo。这时,y的类型就会被自动推导为(x: string) => string,与foo的类型相同。然后我们用一个箭头函数表达式实现了一个与foo具有相同类型的函数,再将其赋值给了y。最后我们打印出foo和y的结果,可以发现它们分别输出"hello!"和"hello?"。

keyof

keyof可用于获取对象类型的键类型,其语法为:

keyof T

这里的T是一个对象或类类型,返回结果为T的键类型。

示例1

interface Person {
  name: string;
  age: number;
}

let x: keyof Person = 'name';
let y: keyof Person = 'age';
let z: keyof Person = 'email'; //编译错误:类型 '"email"' 的值不能赋给类型 '"name" | "age"'。

在上面的例子中,我们定义了一个接口类型Person,包含两个属性name和age。然后我们定义了三个变量:x、y、z,它们的类型都是keyof Person,即T的键类型。

我们可以发现,变量x的值为"name",变量y的值为"age",而变量z的值为"email",因为"email"并不是Person类型的键,所以它会被TypeScript认为是一个错误。

示例2

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  sayHi() {
    console.log(`Hi, my name is ${this.name}, and I am ${this.age} years old.`);
  }
}

let x: keyof Person = 'name';
let y: keyof Person = 'age';
let z: keyof Person = 'email'; //编译错误:类型 '"email"' 的值不能赋给类型 '"name" | "age"'。

在上面的例子中,我们定义了一个类Person,包含两个属性name和age,以及一个方法sayHi。方法sayHi会输出一个包含类属性的字符串。

然后我们定义了三个变量:x、y、z,它们的类型都是keyof Person,即T的键类型。

我们可以发现,变量x的值为"name",变量y的值为"age",而变量z的值为"email",因为"email"并不是Person类型的键,所以它会被TypeScript认为是一个错误。

最后我们可以实例化一个Person对象,并在其上调用sayHi方法,从而输出一个形如"Hi, my name is Tom, and I am 25 years old."的字符串。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TypeScript基本类型之typeof和keyof详解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node.js readline和line-reader逐行读取文件方法

    当我们需要逐行读取文件时,可以使用node.js的readline和line-reader模块。下面是具体的攻略: 使用readline模块逐行读取文件 readline模块是node.js中用来逐行读取文件的核心模块,其基本用法如下: const readline = require(‘readline’); const fs = require(‘fs’…

    node js 2023年6月8日
    00
  • Node.js的文件权限及读写flag详解

    一、文件权限 文件权限分为三个方面:读、写、执行。这些权限的挂靠分为三级:文件拥有者、文件所属组、其他用户。 文件拥有者权限: 用户如果是文件的拥有者,则其拥有读写和执行并可设置其他用户或组权限的权限。改变此文件的所有者时,此操作只能由root或该文件的原始所有者进行。 文件所属组权限: 比如一个文件组为web,那么所有web组的用户或者root用户都可以读…

    node js 2023年6月8日
    00
  • React Native 的动态列表方案探索详解

    下面我将分享一份对于“React Native 的动态列表方案探索详解”的完整攻略。 React Native 的动态列表方案探索详解 背景 在 React Native 的开发中,动态列表是非常常见的场景。例如商品列表、新闻列表、推荐列表等等。本文将介绍一些常见的动态列表实现方案,并针对每种方案的优缺点进行说明。 方案一:使用 FlatList FlatL…

    node js 2023年6月8日
    00
  • 详解Node.js利用node-git-server快速搭建git服务器

    详解Node.js利用node-git-server快速搭建git服务器 简介 Git 是一个开源分布式版本控制系统,可以有效管理程序代码、文档等等。搭建 Git 服务器是我们经常需要做的事情。本文将介绍如何使用 Node.js 和 node-git-server 快速搭建 Git 服务器。 步骤 步骤一:安装 Node.js 首先,在你的服务器上安装 No…

    node js 2023年6月8日
    00
  • node文件上传功能简易实现代码

    这里是”node文件上传功能简易实现代码”的完整攻略。 1. 确认需求和环境 确认需要实现的功能是文件上传,并且需要选择上传文件的界面和上传后的文件存储位置。需要使用Node.js运行环境和一些必要的npm包,如express和multer。 2. 安装必要的npm包 npm install express multer –save multer 是一个 …

    node js 2023年6月8日
    00
  • NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to

    这个警告是因为当前使用的 minimatch 版本已经被废弃,而 cordova 依赖的 minimatch 的最低版本是 3.0.0。为了解决这个问题,我们需要升级 minimatch 到最新版本。 具体的解决步骤如下: 执行npm install minimatch@最新版本号 命令安装最新版本的 minimatch。例如: npm install mi…

    node js 2023年6月8日
    00
  • nest.js,egg.js,midway,express,koa的区别小结

    这是一篇关于几个Node.js的框架的区别小结的攻略。这里我们将会对Nest.js、Egg.js、Midway、Express和Koa几个框架进行比较,并从不同的角度去探讨它们的各自优势和适用场景。 Nest.js 架构风格:基于Angular开发的服务端MVC框架,基于模块化和依赖注入的理念。 优势: 具有很好的可扩展性和可维护性。 内置了丰富的功能模块,…

    node js 2023年6月8日
    00
  • 深入分析node.js的异步API和其局限性

    深入分析node.js的异步API和其局限性 Node.js以其出色的异步I/O能力而闻名,其异步API是Node.js中实现非阻塞I/O操作的关键。但是,开发人员需要深入了解这些异步API,以便更好地利用其优势并规避其局限性。 异步API Node.js提供了一系列的异步API,包括回调函数、事件驱动、Promise等等。其中,回调函数是Node.js中最…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部