当前位置: 首页 > news >正文

Typescript面试题

文章目录

  • 了解过TS吗?
  • 使用ts写一个对象属性约束
  • 说一下typescript中的泛型
  • 如何在TS中对函数的返回值进行类型约束
  • ts和js相比有什么区别

了解过TS吗?

ts是一种基于静态类型检查的强类型语言

let num:number=20
console.log(num)
console.log("str")

ts支持的数据类型

数组

let arr:number[]=[1,2,3,4,5]
//将let定义为一个数组,每一项都是number
let arr:number[]=[1,2,3,4,5,"str"]   //报错不能将类型string分配给类型number
let arr1:Array<number|string>=[1,2,3,4,5,"str"]//这样写就不会报错
//通过给范型添加多类型,让数组支持多种数据格式

元组Tuple
规定元素类型和规定元素数量和顺序的数组
特点:不要越界访问
定义的是什么类型写的就是什么类型,可以使用数组的下标取值,但是如果使用数组的push方法的话,虽然输出的数组中有,但是取值的话会报错可以打印出来但不建议这样写,这就说了元组的一个越界问题

let tu:[number,string]
tu=[1,"str"]

枚举
1.有限的可列举出来的命名和索引对应的类型
2枚举类型的优势:语义化可维护性
3原理:反向映射,互相指向

//定义了一个枚举
enum user{admin,guest,develoment,pm
}
console.log(user)
//使用user类型来定义枚举变量any

代表任意类型:

let t:any=10
t="str"
t=true

接口:跟另一个事物之间的一个媒介

interface userInfo{name:string;age:number;address?:string//问号代表该属性可添加可不添加
}
function getUserInfo(u:userInfo){console.log(u.name)   //张三
}
let user1 = {name:"张三",age:24,address:"北京"}
getUserInfo(user1)

使用ts写一个对象属性约束

使用{useName:string, password:number}约束传入的userData参数(并将password置为可选参数)

class User{useName:string;password?:number|undefined;//使用{useName:string, password?:number|undefined}约束传入的userData参数constructor(userData:{useName:string, password?:number|undefined}){this.useName=userData.useName;if(userData.password)this.password=userData.password;}
}let u1=new User( {useName:"小猪猪", password:12233} );
let u2=new User( {useName:"大猪猪"} )console.log(u1); 
console.log(u2);

说一下typescript中的泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

通俗理解:泛型就是解决类 接口 方法的复用性、以及对不特定数据类型的支持

function getData(value:string):string{return value //只能返回string类型的数据
}//想要同时返回string和number类型
//1.通常: 代码冗余
function getData1(value:string):string{return value
}
function getData2(value:number):number{return value
}
//2.用any(可以解决,但是放弃了类型检查)
function getData(value:any):any{return value //什么类型都可以
}
//传入什么返回什么。比如传入number类型,必须返回number类型。传入string必须返回string类型。用any就可以不一致。//泛型,可以支持不特定的数据类型
//要求:传入参数和返回的参数一致
//这里的T指泛型,也可以用任意字母取代,但是前后要一致
function getData<T>(value:T):T{return value
}
function getData<T>(value:T):T{return 'xxxx' //错误写法。不能将任何任性分配给T
}
//调用
getData<number>(123); //123 
getData<number>('xxx'); //错误写法//可以调用的时候传一个泛型,返回的时候返回其他的类型(用的不多)
function getData<T>(value:T):any{return 'xxx'
}
//调用 
getData<number>(123); //xxx
getData<string>('xxx'); //xxx
//定义泛型是什么类型,就要传入什么类型的参数

如何在TS中对函数的返回值进行类型约束

ts中函数参数的类型定义

函数的参数可能是一个,也可能是多个,有可能是一个变量,一个对象,一个函数,一个数组等等。

1.函数的参数为单个或多个单一变量的类型定义

function fntA(one, two, three) {// 参数 "two" 隐式具有 "any" 类型,但可以从用法中推断出更好的类型。return one + two + three
}
const aResult = fntA(1, '3', true)

修改后:

function fntA(one: number, two: string, three: boolean) {return one + two + three
}
const aResult1 = fntA(1, '3', true)
// 如果函数的参数为单个或者多个变量的时候,只需要为这些参数进行静态类型下的基础类型定义就行

2.函数的参数为数组的类型定义

function fntB(arr) {//参数 "arr" 隐式具有 "any" 类型,但可以从用法中推断出更好的类型。return arr[0]
}
const bResult = fntB([1, 3, 5])

修改后:

function fntB(arr: number[]) {return arr[0]
}
const bResult1 = fntB([1, 3, 5])
// 如果参数是数组时,只需要为这些变量进行对象类型下的数组类型定义

3.函数的参数为对象的类型定义

function fntC({ one, two }) {return one + two
}
const cResult = fntC({ one: 6, two: 10 })

修改后:

function fntC({ one, two }: { one: number, two: number }) {return one + two
}
const cResult1 = fntC({ one: 6, two: 10 })
// 如果参数是对象,只需要为这些变量进行对象类型下的对象类型定义

4.函数的参数为函数的类型定义

function fntD(callback) {//参数 "callback" 隐式具有 "any" 类型,但可以从用法中推断出更好的类型callback(true)
}
function callback(bl: boolean): boolean {console.log(bl)return bl
}
const dResult = fntD(callback)

修改后:

function fntD(callback: (bl: boolean) => boolean) {callback(true)
}
function callback(bl: boolean): boolean {console.log(bl)return bl
}
const dResult = fntD(callback)
// 如果参数是函数,只需要为参数进行对象类型下的函数类型定义即可

ts中函数返回值的类型定义

当函数有返回值时,根据返回值的类型在相应的函数位置进行静态类型定义即可

返回数字:

function getTotal2(one: number, two: number): number {return one + two;
}
const total2 = getTotal(1, 2);
// 返回值为数字类型

返回布尔值

function getTotal2(one: number, two: number): boolean {return Boolean(one + two);
}
const total2 = getTotal(1, 2);
// 返回值为布尔类型

返回字符串

function getTotal2(one: string, two: string): string{return Bone + two;
}
const total2 = getTotal('1', '2');
// 返回值为字符串

返回对象

function getObj(name: string, age: number): { name: string, age: number } {return {name,age}
}
getObj('小红',16)
// 返回值为对象

返回数组

function getArr(arr: number[]) :number[]{let newArr = [...arr]return newArr
}
getArr([1,2,3,4])
// 返回值为数组

函数返回值为underfinde,仅仅时为了在内部实现某个功能,我们就可以给他一个类型注解void,代表没有任何返回值,

function sayName() {console.log('hello,world')
}

修改后:

function sayName1(): void {console.log('无返回值')
}

当函数没有返回值时

// 因为总是抛出异常,所以 error 将不会有返回值
// never 类型表示永远不会有值的一种类型
function error(message: string): never {throw new Error(message);
}

ts和js相比有什么区别

  • 在ts中完全可以使用js
  • ts是js的超集,并且ts比js多了一个类型检查功能
http://www.lryc.cn/news/107768.html

相关文章:

  • GB28181智能安全帽方案探究及技术实现
  • 【css】解决元素浮动溢出问题
  • SOC FPGA之流水灯设计
  • 无涯教程-Lua - Iterators(迭代器)
  • HTML+CSS+JavaScript:实现B站评论发布效果
  • 实战 - 利用 ThreadLocal 线程局部变量实现数据缓存
  • wxwidgets Ribbon使用简单实例
  • 2023年第四届“华数杯”数学建模思路 - 案例:最短时间生产计划安排
  • LeetCode404. 左叶子之和
  • Nginx 高性能内存池 ----【学习笔记】
  • iOS--frame和bounds
  • docker logs 使用说明
  • Ceph入门到精通-Ceph PG状态详细介绍(全)
  • 【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树
  • 【JVM】(二)深入理解Java类加载机制与双亲委派模型
  • npm i 报错项目启动不了解决方法
  • 【从零开始学习JAVA | 第三十七篇】初识多线程
  • 微信新功能,你都知道吗?
  • Android 中 app freezer 原理详解(二):S 版本
  • Vue3_04_ref 函数和 reactive 函数
  • 05 Ubuntu下安装.deb安装包方式安装vscode,snap安装Jetbrains产品等常用软件
  • 性能测试jmeter连接数据库jdbc(sql server举例)
  • 8.3 C高级 Shell脚本
  • 2023年华数杯A题
  • 【零基础学Rust | 基础系列 | 函数,语句和表达式】函数的定义,使用和特性
  • 加解密算法+压缩工具
  • FeignClient接口的几种方式总结
  • springBoot多数据源使用tdengine(3.0.7.1)+MySQL+mybatisPlus+druid连接池
  • 剑指Offer 05.替换空格
  • ChatGPT的功能与特点