问答

typescript字符串索引报错

作者:admin 2021-04-16 我要评论

将上述代码放到编辑器中, obj[key] 会提示 ‘类型“string”无法用于索引类型“T”’ function fooT extends { [k: string]: string } = { [k: string]: string...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

将上述代码放到编辑器中,obj[key]会提示 ‘类型“string”无法用于索引类型“T”’

function foo<T extends { [k: string]: string } = { [k: string]: string }>(key: string): T | null {
  const obj = {} as T;
  obj[key] = 'asd';
  return key ? obj : null;
}

但是下面这种情况却不会报错

const a: string = 'a';
const obj: { [K: string]: string } = {
  [a]: '123',
};

为什么上面那种情况就无法索引对象呢?

###

感觉这个应该跟你类型断言的时机有关系,当你断言obj为泛型T的时候,obj就变成泛型T的一个具体实例了,虽然泛型 T 表示它的key索引是字符类型,value也是字符类型,但对于它的实例,多一个字段和少一个字段就是不同的类型了,它们之间不能安全的转换。
所以如你上面所说的示例,可行的写法是:

const obj = {};
obj[key] = 'asd';
return key ? (obj as T) : null;

或者如果就一个字段:

const obj = {
  [key]: 'asd'
} as T;
return key ? obj : null;

当然上面的方式更具有普遍性,下面的写法能比较直观地看出你提前断言与后断言的差别。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器