gpt4 book ai didi

typescript - 处理泛型 T 和函数的联合类型时出现错误 2349

转载 作者:行者123 更新时间:2023-12-04 09:37:31 26 4
gpt4 key购买 nike

如何修复以下代码以解决 2349?

function fillArray<T>(arr: T[], value: T | ((index: number) => T)): void {
if (typeof value === 'function') {
for (let i = 0; i < arr.length; i++) {
arr[i] = value(i)
}
} else {
arr.fill(value)
}
}
TypeScript 报告 value(i) 的错误作为:

This expression is not callable.Not all constituents of type '((index: number) => T) | (T & Function)' are callable.


见: Playground Link

最佳答案

不确定究竟是什么导致了错误(可能与此 issue 与缩小泛型类型参数有关)。
作为解决方法,您可以定义和使用 custom type guard :

function isFunction<T>(value: T | ((index: number) => T)): value is (index: number) => T {
return typeof value === 'function';
}

function fillArray<T>(arr: T[], value: T | ((index: number) => T)): void {
if (isFunction(value)) {
for (let i = 0; i < arr.length; i++) {
arr[i] = value(i)
}
} else {
arr.fill(value)
}
}
Playground

@VLAZ 发现的其他工作选项是使用 instanceof守卫而不是 typeof :
function fillArray<T>(arr: T[], value: T | ((index: number) => T)): void {
if (value instanceof Function) {
for (let i = 0; i < arr.length; i++) {
arr[i] = value(i)
}
} else {
arr.fill(value)
}
}
Playground

另一个工作选项 - 使数组类型成为通用参数:
function fillArray<A extends Array<unknown>>(
arr: A,
value: A[number] | ((index: number) => A[number])
): void {
if (typeof value === 'function') {
for (let i = 0; i < arr.length; i++) {
arr[i] = value(i)
}
} else {
arr.fill(value)
}
}
Playground

关于typescript - 处理泛型 T 和函数的联合类型时出现错误 2349,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62500700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com