学习和使用ts的一些小记录

ts曾经碰到过这个问题

type Test<T extends Record<symbol, unknown>> = T;

type Result = Test<{
  a: string;
}>;  
//这个例子本意是限制只能使用symbol做为属性,可当传入a属性时,竟然是符合的

后来找到了答案
也引出了隐式索引签名

隐式索引签名
如果对象文字中的所有已知属性都可以分配给该索引签名,则对象文字类型现在可以分配给具有索引签名的类型。这使得可以将使用对象文字初始化的变量作为参数传递给需要映射或字典的函数:
function httpService(path: string, headers: { [x: string]: string }) {}
const headers = {
“Content-Type”: “application/x-www-form-urlencoded”,
};
httpService("", { “Content-Type”: “application/x-www-form-urlencoded” }); // Ok
httpService("", headers); // Now ok, previously wasn’t

解决方案是将string和number做为key时的类型限制为never

type Test<T extends Record<symbol, unknown> & Record<string | number, never>> = T;;

type Result = Test<{ // ! error, string/number keys should be type never
  a: string;
}>;

判断对象是否为空对象

type isEmpty<T extends Record<string | symbol, unknown>> = keyof T extends never
  ? true
  : false;

将T类型的K属性变为可选

在使用delete操作符时经常会遇到的问题,我们希望必须传入这个属性但在后面的使用中可能会删除它

// Omit从T中取出除了K以外的属性  Partial作用是将传入的属性变为可选项.Pick从T中取出一系列K的属性 
type makeTypeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值