我有以下类型声明:
function eachr<Subject extends Array<Value>, Value>(
subject: Subject,
callback: (
this: Subject,
value: Value,
key: number,
subject: Subject
) => void | boolean
): Subject {
// contrived
return subject
}
但是,当有人打电话给它时:
eachr(['a', 'b', 'c'], function(value, key) {})
value
的类型是{}
,而我希望它是string
。
我可以将其修改为以下内容:
function eachr<Subject extends any[]>(
subject: Subject,
callback: (
this: Subject,
value: Subject[number],
key: number,
subject: Subject
) => void | boolean
): Subject {
return subject
}
似乎可行。
以及以下内容:
function eachr<
Subject extends any[],
Key extends number,
Value extends Subject[Key]
>(
subject: Subject,
callback: (
this: Subject,
value: Value,
key: Key,
subject: Subject
) => void | boolean
): Subject {
// contrived
return subject
}
但是,我不知道它们为什么起作用,但是我的第一次尝试却没有。
答案 0 :(得分:2)
您应该只更改了subject
参数的类型(在函数的第一个版本中),如下所示:
subject: Subject & Array<Value>
原因是:将类型参数放入<Subject extends Array<Value>, Value>
的类型参数列表中时,从不会推断出类型参数,而是从常规参数列表中推断出它,即subject: /**/, callback: /**/
。这意味着Value
是从callback
推断出来的,TS没有机会将其推断为{}