不确定如何制定问题,但情况确实如此:
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
错误:
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'.
为什么在第一种情况下没有错误(没有类型可比性检查),是设计还是存在问题?
答案 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)
非常有趣,我不知道。
看起来任何强类型数组文字只能包含已知元素。 从错误消息来看,它看起来像是设计而不是错误。