【发布时间】:2022-01-26 14:35:17
【问题描述】:
interface Fn {
(data: Data): void
}
interface Data<Value = any, Deps extends any[] = [...any]> {
value: Value
list: Deps
}
function fn(data: Data<string, [number]>): void {
console.log(data)
}
const foo: Fn[] = [fn]
console.log(foo)
当tested against the TypeScript Compiler 这个代码因为Type 'any[]' is not assignable to type '[number]' 而抛出错误。
我的直觉是定义的fn 被分配给通用的Data 值,但错误表明分配方向相反。这是 TypeScript 编译器的错误还是限制?或者我应该如何思考才能有更好的直觉?
【问题讨论】:
-
我知道@AluanHaddad 的区别。关键是,就我而言,
fn适合Fn接口,因为[number]可以分配给any[]。错误是不能将any[]分配给[number]...虽然这显然是正确的,但为什么要朝那个方向分配? -
对不起,我误读了这个问题。我的错。
-
@alecmce 你不是想在这里做相反的事情吗?您不是将数字传递给 any,而是尝试将 any 传递给数字。
-
@Andrew,不。我认为你在这里搞错了。请查看问题中的链接。
Deps是any[]类型的数组。fn表达式使用一个元组[number],它不是number[],而是一个正好为1 值的数字数组。因此,[number]是any[]的子类型。我正在尝试将更具体的类型传递给更一般的情况。 -
@alecmce 不,你倒退了,这就是你问这个问题的原因。您试图断言一个类型比它定义的更具体。您正在尝试将定义为类型为
any[]的值传递给一个断言它是[number]的函数,您在函数签名中断言的内容比 yiu 在您打算传递的类型中所做的更具体,因此 any[] 正在发生into [number] 无效,不会编译。
标签: typescript typescript-generics