gpt4 book ai didi

typescript - 键入一个将任何参数包装到数组中的函数

转载 作者:行者123 更新时间:2023-12-04 02:27:37 25 4
gpt4 key购买 nike

我正在尝试正确键入一个接受参数并将其包装到数组中的函数,但是,我无法使键入正常工作。

function wrapInArray<T>(data:T):T extends Array<infer K>? K[]: T[]{

return Array.isArray(data)? [...data]:[data]
// ^ Type '(T & any[])[number][]' is not assignable to type 'T extends (infer K)[] ? K[] : T[]'
}

const a = wrapInArray('test') // string[]

const b = wrapInArray([1,2]) // number[]

该函数工作正常,如果我尝试使用该函数,typescript 会正确推断返回类型。现在我想知道为什么函数声明本身会出错。

TS Playground

最佳答案

这是由于 isArray 函数的性质。它是这样输入的:

isArray(arg: any): arg is any[];

所以当它为真时,arg is any[] 表示数据是 any[] 但你也说它是 T 所以你最终得到 T & any[]...

怎么样(不需要重载和奖励,我们不必指定函数返回什么,我们会让 Typescript 为我们推断):

function wrapInArray<T>(data: T | T[]){ //function wrapInArray<T>(data: T | T[]): T[]
if (Array.isArray(data)) {
// (parameter) data: T[]
// T was either T | T[] but it's an array, we're left with only T[]
return [...data]
} else {
// (parameter) data: T
// data was either T | T[] but it's not an array so we're left with T
return [data] // we return [T]
}
}

const a = wrapInArray('test') // string[]

const b = wrapInArray([1,2]) // number[]

TS Playground

关于typescript - 键入一个将任何参数包装到数组中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66410687/

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