TS:为什么可以将无效类型分配给泛型类型变量?

时间:2016-10-24 22:43:07

标签: generics typescript

不确定如何制定问题,但情况确实如此:

interface X {
  some: number
}

let arr1: Array<X> = Array.from([{ some: 1, another: 2 }]) // no error
let arr2: Array<X> = Array.from<X>([{ some: 1, another: 2 }]) // will error

code in playground

错误:

Argument of type '{ some: number; another: number; }[]' is not assignable to parameter of type 'ArrayLike<X>'.
  Index signatures are incompatible.
    Type '{ some: number; another: number; }' is not assignable to type 'X'.
      Object literal may only specify known properties, and 'another' does not exist in type 'X'.

为什么在第一种情况下没有错误(没有类型可比性检查),是设计还是存在问题?

2 个答案:

答案 0 :(得分:1)

让我们看看两个数组实例的类型 如果我们拿走类型定义:

SELECT

code in playground:悬停数组变量以查看类型)

这是因为Array.from的签名是:

// type of arr1 is { some: number; another: number; }[]
let arr1 = Array.from([{ some: 1, another: 2 }]);

// type of arr2 is X[]
let arr2 = Array.from<X>([{ some: 1, another: 2 }]);

编译器不会为from<T>(arrayLike: ArrayLike<T>): Array<T>; 投诉,因为它会根据传递给函数的值推断出通用约束。
但是在arr1的情况下,通用约束设置为arr2,而X类型与之匹配。

如果您尝试将{ some: number; another: number; }添加到X

arr1

你会得到:

arr1.push({ some: 3 }); 

答案 1 :(得分:1)

非常有趣,我不知道。

看起来任何强类型数组文字只能包含已知元素。 从错误消息来看,它看起来像是设计而不是错误。