在流中,如何接受异构数组并返回该数组

时间:2019-02-22 08:56:57

标签: javascript generics casting flowtype heterogeneous-array

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

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

但是,如果数组为异构类型,则此操作将失败,因为T随数组而不同。现在,由于我知道T将始终是某个基数的子类型:BaseTy,并且在该函数期间,我仅使用来自/在该基类型上进行操作的函数,因此我可以这样写:

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

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

可以在不依靠不安全的类型转换或any的情况下解决此问题吗?

1 个答案:

答案 0 :(得分:1)

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

            <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="mycoolapp" />
        </intent-filter>
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:host="example.com" android:pathPrefix="/" android:scheme="https" />
            <data android:host=" " android:pathPrefix="/" android:scheme=" " />
            <data android:host=" " android:pathPrefix="/" android:scheme=" " />
            <data android:host=" " android:pathPrefix="/" android:scheme=" " />
            <data android:host=" " android:pathPrefix="/" android:scheme=" " />
        </intent-filter>

完整代码示例:

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

Try

就像乔丹说的那样,如果您遇到variance的麻烦,则可能需要将输入数组的类型更改为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)

$ReadOnlyArray