6.29 drilling notes

ts泛型复习

ts 复制代码
function valueProjectorReturnSameType<T>(arg1:T):T{
    return arg1
}

function valueProjectorReturnSameType2<T,G>(arg1:T|G):T|G{
    return arg1
}

函数名<T>指定使用泛型T

泛型,但要求有某个属性,要用比如T.name? extends泛型约束

ts 复制代码
interface SomeType{
    name:string
}

function genericTypeWithRestraint<T extends SomeType>(arg1:T){
    return arg1.name
}

console.log(genericTypeWithRestraint({name:'wang',age:10}))

函数名<T extends 一个接口> 添加约束

类型推断练习

套路:type TargetType<T> = T extends 问题类型,要推理的类型使用infer ? K:T

1.写一个PromiseType类型能够获取Promise<string>里的string

ts 复制代码
type PromiseType<T> = ? // T extends Promise<infer K>?K:T

type MyPromiseReturnType = PromiseType<Promise<string>>

const a:MyPromiseReturnType = 'a'

有一个类型组成的数组[string, number],写一个类型推断出该数组元素的类型

ts 复制代码
type ArrayTypeList<T> = ?? // T extends (infer I)[]?I: T

type ItemType1 = ArrayTypeList<[string,number]>

const item1:ItemType1='a' // string|number
  1. 函数有关的推断
ts 复制代码
\\推断第一个参数的类型
type FirstArg<T> = T extends (first: infer F, ...args:any[])=>any?F:T;

type FA = FirstArg<(name:string,age:number)=>void>


type PersonHere = {
    person:string
}

type MyReturnType<T> = T extends (name:string,age:number)=>infer F?F:T;

type ReturnedType = MyReturnType<(name:string,age:number)=>PersonHere>

const mannn:ReturnedType = {person:'aaa'}

协变(Covariance) 与 逆变(Contravariance)

面向对象的概念。 协变:子类对象赋值给父类型的变量:Parent A = new Child() 逆变:Child A = new Parent()

逆变: 父类型的形参,可接受子类型对象。

ts 复制代码
interface Person{
    name:string
}

interface Programmer extends Person{
    skill:string
}

type pf=(arg:Person)=>void  //定义一个pf类型的函数
type tf=(arg:Programmer)=>void //定义一个tf类型的函数

let f1:pf=(c:Person)=>{}
let f2:tf=(p:Programmer)=>{}

f1=f2 //error! skill is missing in pf
//f1是pf类型,他想要接收一个Person类型的参数,
//如果调用f1,因为f1是pf类型,所以调用时传进去一个Person类型的变量,
//但函数体变成了f2,它是对Programmer处理的,比如可能使用c.skill,而Person类型的变量没有skill。
//于是造成了类型不安全

f2=f1 //ok. f2变成f1后,因为f1接受子类对象o,而调用f2时,使用子类对象,以及f1中定义的逻辑,这个o一定都能用

返回值时:

ts 复制代码
interface Person{
    name:string
}

interface Programmer extends Person{
    skill:string
}

type pf=()=>Person
type tf=()=>Programmer

let f1:pf=()=>({name:'wang'})
let f2:tf=()=>({name:'wang',skill:'singing'})
f2=f1//error!!! 这时候是f1的函数体功能是构建一个Person类型返回值,但它赋值给f2后,缺了skill,
相关推荐
程序员黑豆7 分钟前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC39 分钟前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea1 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望1 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少2 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0072 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis3 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝4 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师4 小时前
新兴多智能体系统的模式与问题
前端
用户059540174465 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css