为什么`Array <value>,Value`不能用于获取数组值类型?

时间:2019-01-02 10:39:41

标签: typescript

我有以下类型声明:

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
}

但是,我不知道它们为什么起作用,但是我的第一次尝试却没有。

1 个答案:

答案 0 :(得分:2)

您应该只更改了subject参数的类型(在函数的第一个版本中),如下所示:

subject: Subject & Array<Value>

原因是:将类型参数放入<Subject extends Array<Value>, Value>类型参数列表中时,从不会推断出类型参数,而是从常规参数列表中推断出它,即subject: /**/, callback: /**/。这意味着Value是从callback推断出来的,TS没有机会将其推断为{}

以外的其他东西。