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日

相关文章

  • 详细谈谈NodeJS进程是如何退出的

    当NodeJS进程退出时,会发生以下几个事件: 执行完所有的exit回调函数 事件循环结束 所有未被清理的定时器和Interval函数被清理 通过process.exit()函数强制终止进程 NodeJS进程可以通过以下几种方式退出: 自然退出:所有的任务都完成了,NodeJS自动退出进程。 抛出未被捕捉到的异常:抛出未被捕捉到的异常也会使NodeJS进程退…

    node js 2023年6月8日
    00
  • 专业级Vue 多级菜单设计

    下面是“专业级Vue 多级菜单设计”的完整攻略,包括以下步骤: 1. 分析需求 在设计任何一个组件之前,我们需要先明确需求,了解用户需要什么样的菜单。比如,需要多少级别的菜单?菜单项是否需要展开或折叠?菜单项是否需要动态渲染数据?等等。 在本次设计中,我们需要实现一个可以展示多个级别的菜单,菜单项可以展开或折叠,菜单项需要动态渲染数据,同时需要支持用户对菜单…

    node js 2023年6月8日
    00
  • node.js中的console.dir方法使用说明

    下面是关于 Node.js 中的 console.dir 方法使用说明的攻略。 什么是 console.dir 方法 console.dir 方法是 Node.js 内置的一个调试方法,用于打印一个对象的所有属性和方法,类似于浏览器中的 console.log 方法,但是能够以更清晰的方式显示对象的结构。 如何使用 console.dir 方法 consol…

    node js 2023年6月8日
    00
  • Vue中引入swiper报错的问题及解决

    当我们在Vue中引入Swiper时,有时会遇到一些报错问题,下面我将详细讲解这些问题及其解决方法。 问题1:’$’未定义 当我们在Vue中引入Swiper时,如果出现’$’未定义的报错,这是因为jQuery和Swiper的标识符会出现冲突,使用以下方法可以解决: 在项目中安装jquery: npm install jquery –save 在main.js…

    node js 2023年6月8日
    00
  • vs code怎么搭建NodeJs的开发环境? vscode运行nodejs代码的技巧

    下面来详细讲解在 VS Code 中如何搭建NodeJs的开发环境,并介绍运行NodeJs代码的技巧。 搭建NodeJs的开发环境 步骤一:下载Node.js 下载Node.js最新版本,下载链接为:https://nodejs.org/en/download/ 步骤二:安装Node.js 安装Node.js,可以直接使用默认配置,一路“下一步”即可。 步骤…

    node js 2023年6月8日
    00
  • Node.js API详解之 string_decoder用法实例分析

    好的。先介绍一下如何组织一篇Markdown格式的文章: 标题用#表示,#越多代表标题级别越高。代码块使用“`包裹,可以指定语言类型,例如javascript。引用内容使用>。*开头表示无序列表,数字开头表示有序列表,-开头表示二级无序列表,以此类推。还有其他格式,可以参考Markdown教程。 下面开始具体介绍“Node.js API详解之 str…

    node js 2023年6月8日
    00
  • node.js中的fs.close方法使用说明

    当在Node.js中读写文件或流时,通常需要关闭文件以释放与其相关的资源。fs.close方法可以用于关闭文件。 方法说明 fs.close方法用于关闭一个已经打开的文件。它的语法如下: fs.close(fd, callback) 其中,fd是文件描述符,它指向一个已经打开的文件。callback是一个回调函数,当文件关闭完成时被调用。该方法没有返回值。 …

    node js 2023年6月8日
    00
  • npm国内镜像 安装失败的几种解决方案

    npm国内镜像 安装失败的几种解决方案 为什么需要使用npm国内镜像? npm是一个万物皆可安装的丰富资源库,我们经常会使用npm来获取很多工具和第三方库。但是,由于我们的网络环境和国外的npm服务器环境之间距离较远,因此在下载安装npm包时可能会出现访问和网络延迟的问题,导致npm包无法下载或下载速度缓慢。为了解决这个问题,我们可以使用国内的npm镜像,加…

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