首页 > 解决方案 > 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 ?

标签: typescripttypes

解决方案


在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 原型成员,并且新对象绝对不是数组。我会说这是打字稿类型系统中的一个错误。


推荐阅读