用于编写数组条目签名的 [key in string] 是啥意思?

Posted

技术标签:

【中文标题】用于编写数组条目签名的 [key in string] 是啥意思?【英文标题】:What means [key in string] used to write an array's entries signatures?用于编写数组条目签名的 [key in string] 是什么意思? 【发布时间】:2021-08-02 16:26:08 【问题描述】:

我正在阅读interfaces with index signatures,它允许为数组编写这样的接口:

interface StringArray 
  [index: number]: string;

我还从this thread 看到了这个例子,它也允许以这种方式写签名:

type ResponseKeys = 'devices' | 'languages' | 'frameworks' | 'backend';

export class Survey 
  isCompleted: boolean;
     response: 
       [key in ResponseKeys]: string[]
     ;
 

但我发现 [key in string] 是什么意思 somewhere in a doc :

const [texts, setTexts] = useState< [key in string]: fabric.ITextboxOptions >(
  '0':  text: 'A', left: 0 ,
  '1':  text: 'B', left: 30 ,
  '2':  text: 'C', left: 60 ,
);

即使当我尝试阅读“in operator”时,我也无法找到测试键是否为字符串类型的含义。 请问有什么线索吗?

【问题讨论】:

【参考方案1】:

编辑这个

interface Invalid 
  [key in string]: string;


interface Valid 
  [key: string]: string;


type ValidType = 
  [key in string]: string;

Playground

type 更灵活,可以接受这两种语法。此外,[key in type] 更灵活,将允许in 不允许的一些用途,但我手头没有它们。

它们为什么存在?我不知道...


原答案:

[key in string]: T 是一种通配符。这意味着分配的对象必须只有字符串键。

'property' 还可以 '0' 还可以 0 不是
const obj:  [key in string]: number  = ;

obj['0'] = 1; // ok
obj[0] = 1; // not ok!
obj.property = 1; // ok

【讨论】:

[index: string]: string; 不要求对象也必须有字符串键?我还想知道使用 in 运算符来表示您所说的含义。无论如何感谢您的确认

以上是关于用于编写数组条目签名的 [key in string] 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

for in,Object.keys()与for of的区别

for in,Object.keys()与for of的区别

为 QA 和 PROD 提供不同的公共签名密钥条目

用于使用序列消除重复条目的 Oracle PLSQL 更新查询

PHP原生xml和数组互转(微信支付签名算法)

sing 签名验证用于表单数据安全效验