Skip to content

Inferred generic type gets lost when trying to return value #36737

Closed
@LinusU

Description

@LinusU

(sorry for the bad title, I really didn't know how to describe this at all, and I've tried reaching out to some other developers who hade no idea either 😬 For the same reason I've also had a hard time searching for similar issues, and didn't really find anything)

TypeScript Version: 3.8.0-dev.20200208 (and 3.7.5)

Search Terms: "is not assignable to"

Code

interface Base { _id: string }
interface Car extends Base { make: string }
interface Pet extends Base { name: string }

interface Collection<T> {
    find(filter: Partial<T>): Promise<T[]>
}

declare const collections: {
    car: Collection<Car>
    pet: Collection<Pet>
}

type ExtractCollection<T extends keyof typeof collections> = (typeof collections)[T] extends Collection<infer R> ? R : never



// $ExpectType Promise<Pet[]>
let a = collections.pet.find({ name: 'test' })

// $ExpectType Car
let b: ExtractCollection<'car'>

// $ExpectType Car | Pet
let c: ExtractCollection<'car' | 'pet'>

// $ExpectType Promise<Car[]>
let d = findById('car', 'test')



function findById<T extends keyof typeof collections>(name: T, id: string): Promise<Array<ExtractCollection<T>>> {
    return collections[name].find({ _id: id }) // <------ Type 'Pet' is not assignable to type 'ExtractCollection<T>'
}

Expected behavior:

I expected no error since ExtractCollection<'pet'> resolves to Pet.

Actual behavior:

Type Pet is not assignable to type ExtractCollection<T>

Playground Link: http://www.typescriptlang.org/play/?ts=3.8.0-dev.20200208&ssl=1&ssc=1&pln=33&pc=1#code/JYOwLgpgTgZghgYwgAgEJwM4oN7IPrAAmAXMhmFKAObIC+AUKJLIigMJxTIQAekIhDGkw5kAWzgBrCKXKUQNBk2jwkyAAoQw3PhAFD0WZLhBwxMshWp16jcCtbI2AewA2riAjDBnIADwAKgB8xvTI4cgwoIQAFFGuzKTqnN5wroFBAJRJUM5iwFiBANoAukH0DPSEnq6cKAi+5MgN7p7ejaTYYREInKQurV4+-hxQ5RHIAA5a-W4eQ75+mmDllWAAntPIAKJ8UIhgA-Pt-gE6-ILI0uvOMMgb07fNc23DGCEAvMgxDxBPLcc3pkigESuc9Jcjq9FqAYNBkAAlEIAfkRyFIIAgADdoLZbAB6fHIAAku2mXgCmxQ6ly+UKy1K5Q82jgyC+AOhIAwADppmBuVEBDETGYLABySDkMV0TIEomknjksCUrajejM5AAI1IuwoByhC38Yt6UDF5XohJJZLaKvYnGQAB8NFp1Vpmjq9vqXoa-MbONKnWK+Wa5VbFTaqRpaQUIH5RozXdpCGzItFUOsAJKxP2mgA0yAlEClsvoMAAriBDamBOms4FwforhAbndfv9vSd3jFTOZSAF80RZFYFNko3kY34AIJQfbrPy6-ZeA0nDJBEJdCZQLRlqAgZ6DTtFHsQEoC6LC-CD5BEGUVehAA

Related Issues: no 😢

Metadata

Metadata

Assignees

No one assigned

    Labels

    Design LimitationConstraints of the existing architecture prevent this from being fixed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions