typescript - Typescript Array[T] 接受 {..T} 作为有效类型
问题描述
useState<Options[]>
当我用作反应钩子时,这让我有点吃惊,当我输入错误{...options}
而不是 时[...options]
,我只是在尝试访问.map
“数组”(对象)并得到 TypeError 时才发现。让我举一个可以澄清我的问题的例子:
interface Option {
title: string;
isSelected?: boolean;
}
function myFunc(options: Option[]): void {}
const options: Option[] = [{title: 'Male', isSelected: true}, {title: 'Female'}, {title: 'Other'}];
const options2 = {...options};
myFunc(options);
myFunc(options2); // why isn't this an error ?
解决方案
在typescript playground上玩耍,似乎 typescript 认为options2
定义为:
const options2: {
[x: number]: Option;
length: number;
toString(): string;
toLocaleString(): string;
pop(): Option | undefined;
push(...items: Option[]): number;
concat(...items: ConcatArray<Option>[]): Option[];
concat(...items: (Option | ConcatArray<...>)[]): Option[];
... 24 more ...;
[Symbol.unscopables](): {
...;
};
}
所以,它实际上看起来像一个 Option 类型的数组Option[]
。但是扩展运算符实际上并没有复制 Array 原型成员,并且新对象绝对不是数组。我会说这是打字稿类型系统中的一个错误。
推荐阅读
- git - 如何在我的服务器上设置 git,并从自身推送?
- symfony - Symfony 4 - 无法访问我的实体集合
- python - Python中的正则表达式在不同字母之前和之后的两个字母
- gitlab - 生成的帖子的链接在 Gitlab 中都被破坏了
- ios - 如何添加新卡/来源以条带化客户帐户?
- java - javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“id”)。预期元素是(无)
- c# - 为什么正则表达式给我字符串的开头
- ruby-on-rails - 如何显示来自 S3/Paperclip/Heroku 的图像?
- html - p 标签占据 100% 的大小
- c# - 必须将 ContentLength 设置为非负数,或将 SendChunked 设置为 true 才能执行写入操作