gpt4 book ai didi

javascript - 在流程中如何接受异构数组并返回该数组

转载 作者:行者123 更新时间:2023-12-03 00:09:04 25 4
gpt4 key购买 nike

当我有一个接受泛型类型数组并返回转换后的数组的函数时,我可以编写:

function myfun<T>(input: Array<T>): Array<T> {}

但是,如果数组是异构类型,则此操作会失败,因为 T 在数组中是不同的。现在,因为我知道 T 将始终是某个基类的子类型:BaseTy,并且在函数期间我只使用来自/在基类型上操作的函数,所以我可以编写:

function myfun(input: Array<BaseTy>): Array<BaseTy> {}

然而,这存在一个问题,即实际类型“丢失”,因此该数组不再是派生类型的异构数组。

是否可以在流程中修复此问题,而无需诉诸不安全的类型转换或any

最佳答案

您需要使用 bounded generic指定可以接受的最小类型,同时还允许函数返回更具体的类型:

function myfun<T: BaseTy>(input: Array<T>): Array<T> {
// whatever you want to do here
return input
}

完整代码示例:

type BaseType = {
base: 'whatever'
}
type TypeA = BaseType & { a: 'Foo' }
type TypeB = BaseType & { b: 'Bar' }
type TypeC = BaseType & { c: 'Baz' }

function myfun<T: BaseType>(input: Array<T>): Array<T> {
return input
}

const a = {
base: 'whatever',
a: 'Foo'
}

const b = {
base: 'whatever',
b: 'Bar'
}

const c = {
base: 'whatever',
c: 'Baz'
}


const aAndBs: Array<TypeA | TypeB> = [a, b]
const aAndCs: Array<TypeA | TypeC> = [a, c]

// Correct
const xs1: Array<TypeA | TypeB> = myfun(aAndBs)

// Error - It's actually returning Array<TypeA | TypeC>
const xs2: Array<TypeA | TypeB> = myfun(aAndCs)

( Try )

就像 Jordan 所说,如果您遇到 variance 问题,您可能需要将输入数组的类型更改为 $ReadOnlyArray :

function myfun<T: BaseType>(input: $ReadOnlyArray<T>): $ReadOnlyArray<T> {
return input
}

关于javascript - 在流程中如何接受异构数组并返回该数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54823338/

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