Typescript中的泛型数组类型

holgip5t  于 2023-01-31  发布在  TypeScript
关注(0)|答案(4)|浏览(198)

我有泛型类型的函数。
但它返回错误Type 'boolean' is not assignable to type 'string'.

function testing<K, V>(array: Array<{ key: K, value: V }>): Array<V> {
    return array.map(data => data.value)
}

testing([{ key: 1, value: "one" }, { key: 2, value: true }])

我怎样才能修复这个泛型类型的问题,保持类型的泛型。因为数组是未知的,值可能有不同的自定义类型。

e3bfsja2

e3bfsja21#

TS显然不够聪明,无法推断V是一个联合类型,因此对于像这样复杂的参数,您必须显式地声明它。

function testing<K, V>(array: Array<{ key: K, value: V }>): Array<V> {
    return array.map(data => data.value)
}

testing<number, string | boolean>(
    [{ key: 1, value: "one" }, { key: 2, value: true }]
); // works, TS is told explicitly what V is

testing(
    [{ key: 1, value: "one" }, { key: 2, value: "two" }]
); // works, TS correctly infers string
lyr7nygr

lyr7nygr2#

你并不知道value的类型,你应该使用unknown来强制用户输入检查它。
我也不明白为什么需要keyK,因为它们被忽略了。

function testing(array: Array<{value: unknown }>): Array<unknown> {
    return array.map(data => data.value);
}

testing([{ key: 1, value: "one" }, { key: 2, value: true }])
c2e8gylq

c2e8gylq3#

这应该行得通:

function testing<K, V>(array: Array<{ key: K, value: V }>): Array<V> {
    return array.map(data => data.value)
}

testing<number, string | boolean>([{ key: 1, value: "one" }, { key: 2, value: true }])
pgvzfuti

pgvzfuti4#

以下代码将提取每个值的type并返回并集:

type ArrayValueTypes<MyValueArray extends { value: unknown }[]> = {
    [K in keyof MyValueArray]: MyValueArray[K]['value']
}

const myArray = [{ key: 1, value: "one" }, { key: 2, value: true }]

function testing<T extends { value: any }[]>(array: T): ArrayValueTypes<T> {
    return array.map(data => data.value)
}

const result = testing(myArray)
// result is of type (string | boolean)[]

typescript Playground的例子!

相关问题