我读到了一些带有索引签名的接口,它允许为数组编写这样的接口:
interface StringArray {
[index: number]: string;
}
我还从这个线程中看到了这个例子,它也允许以这种方式编写签名:
type ResponseKeys = 'devices' | 'languages' | 'frameworks' | 'backend';
export class Survey {
isCompleted: boolean;
response: {
[key in ResponseKeys]: string[]
};
}
但我在文档中找到了什么意思:
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运算符"的内容时,我也找不到测试键是否为字符串类型的含义。有线索吗?
编辑此
interface Invalid {
[key in string]: string;
}
interface Valid {
[key: string]: string;
}
type ValidType = {
[key in string]: string;
}
游乐场
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