TypeScript技能总结(三)

typescript是js的超集,目前很多前端框架都开始使用它来作为项目的维护管理的工具,还在不断地更新,添加新功能中,我们学习它,才能更好的在的项目中运用它,发挥它的最大功效

//泛型 => 参数和返回值类型相同

//泛型的声明方式:

//语法:在函数名称后面添加<>,里面添加类型变量,比如下面T

//类型变量T,是一种特殊类型的变量,它处理类型而不是值

//该类型变量相当于一个类型容器,能够捕获用户提供的类型(具体是什么类型,由用户调用该函数时指定)

//因为T是类型,因此可以将其作为函数参数和返回值的类型,表示参数和返回值具有相同的类型

//变量类型type,可以是任意合法的变量名称

js 复制代码
function id<T>(name: T): T {
    return name
}

let num = id<number>(10)
let str = id<string>('a')
//调用的时候可以省略类型<>
let num1 = id(200)

//泛型约束

//number上就没有length属性

//此时就需要为泛型添加约束来收缩类型(缩窄类型取值范围)

//1.指定更加具体的类型

js 复制代码
// function getId<T>(value: T): T {
    //之类会报错
//     console.log(value.length)
//     return value
// }

// getId('zzzzzzzzz')
// getId(333333)

function getId<T>(value:T[]): T[] {
    console.log(value.length)
    return value
}

//2.添加约束,是只最类型变量T进行约束

js 复制代码
interface ILength {
    length:number
}
//该约束表示,传入的类型必须有length属性
function getIds<T extends ILength>(value:T):T {
    console.log(value.length)
    return value
}

getIds<string>('11111111111111')
getIds([1,2,3,4,54])

//错误演示
getIds(10)

//类型变量可以有多个,并且类型变量之间还可以相互约束

//keyof后面接收对象类型,生成键名,不是接收对象值

js 复制代码
function getProps<T, K extends keyof T>(obj: T, key: K) {
    return obj[key] 
}

let obj = {
    name: 'gaofeng',
    age:20
}

getProps(obj, 'name')
getProps(obj, 'age')
getProps(18,'toFixed')

//错误演示
getProps(obj, 'sex')
type c = keyof obj

//泛型接口

js 复制代码
interface IdFunc<T>{
    ID: (value: T) => T
    ids: () => T[]
}

let obj: IdFunc<number> = {
    ID(value) {
        return value
    },
    ids() {
        return []
    }
}

obj.ID(1111)
```js

//泛型数组
```js
const arr = ['1', '2']
arr.forEach

//泛型类

js 复制代码
class Foo<T>{
    defaultValue: T
    add: (x: T, y: T) => T 
    constructor(value: T) {
        this.defaultValue = value
    }
}
// const myNums = new Foo<number>(200)
const myNums = new Foo(200)

myNums.defaultValue = 40
myNums.add(10,20)

//泛型工具类

//Partial 将所有属性设置为可选,构建出一个新的类型

//Readonly 将所有的属性设置为只读,构建出一个新的类型

//Pick 从Type中选择一组属性来构造新的类型

//Record构造一个对象类型,属性键为对象类型keyskeys,属性类型为Type

js 复制代码
interface Props {
    id: string,
    children:number[]
}

//错误演示

let obj: Props = {
    id: '11111'
    //此处没加chichildren属性会报错
}

type PartialProps = Partial< Props >

//这里就不会报错
let obj2: PartialProps = {
    id:'222222222'
}

type ReadonlyProps = Readonly<Props>

let obj3: ReadonlyProps = {
    id: 'xxxxxxx',
    children:[22222]
}
//这里就会报错,不能修改
obj3.id = '44444444444'


interface PickType {
    id: string
    title: string
    children:number[]
}

type PickProps = Pick<PickType, 'id' | 'title'>

let obj4: PickProps = {
    id: '1111111',
    title: 'hahahaha',
}


type RecordObj = Record<'a' | 'b' | 'c', string[]>

let obj6: RecordObj = {
    a: ['a'],
    b: ['c'],
    c: ['jjjj']
}
相关推荐
郑州光合科技余经理7 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒7 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche15007 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情6738 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
SoonITer8 小时前
怎样构建一个 Agent-friendly 的网站
前端·agent
颜进强8 小时前
01 · NestJS 是什么:用途、解决什么问题、与热门框架对比
前端·后端·ai编程
wendZzoo8 小时前
前端工程师的 3D 第一课:一个模型如何进入网页
前端
颜进强8 小时前
04 · NestJS 依赖注入:你在 `@Module` 写的 providers,和构造参数里那个类型,是怎么"对上"的?
前端·后端·ai编程
肆仲冬8 小时前
不用框架,用 TypeScript 从零搭一个 Agent 框架
前端
林语琛8 小时前
我写的 switch…break 被 Babel 偷偷吞了
前端·javascript·babel