Skip to content

TS allows wrong assignment #24448

Closed
Closed
@Ailrun

Description

@Ailrun

TypeScript Version: 2.8.1

Search Terms: Type checking, Intersection type, Interface, Optional properties

Code

// Following does not emit any errors (unexpected)
interface Base0 {
    k0: number;
}

type A = Base0
    & { k1?: { file: File, str: string } };

interface B extends Base0 {
    k1?: number;
}

declare const a: A;
const b: B = a;

// However, following emits an error (as expected)
type C =
    & { k1?: { file: File, str: string } };

interface D {
    k1?: number;
}

declare const c: C;
const d: D = c;

Expected behavior: Emits errors for const b: B = a and const d: D = c

Actual behavior: Emits an error only for const d: D = c

Playground Link: https://www.typescriptlang.org/play/index.html#src=%2F%2F%20Following%20does%20not%20emit%20any%20errors.%0D%0Ainterface%20Base0%20%7B%0D%0A%20%20%20%20k0%3A%20number%3B%0D%0A%7D%0D%0A%0D%0Atype%20A%20%3D%20Base0%0D%0A%20%20%20%20%26%20%7B%20k1%3F%3A%20%7B%20file%3A%20File%2C%20str%3A%20string%20%7D%20%7D%3B%0D%0A%0D%0Ainterface%20B%20extends%20Base0%20%7B%0D%0A%20%20%20%20k1%3F%3A%20number%3B%0D%0A%7D%0D%0A%0D%0Adeclare%20const%20a%3A%20A%3B%0D%0Aconst%20b%3A%20B%20%3D%20a%3B%0D%0A%0D%0A%2F%2F%20However%2C%20following%20emits%20an%20error.%0D%0Atype%20C%20%3D%0D%0A%20%20%20%20%26%20%7B%20k1%3F%3A%20%7B%20file%3A%20File%2C%20str%3A%20string%20%7D%20%7D%3B%0D%0A%0D%0Ainterface%20D%20%7B%0D%0A%20%20%20%20k1%3F%3A%20number%3B%0D%0A%7D%0D%0A%0D%0Adeclare%20const%20c%3A%20C%3B%0D%0Aconst%20d%3A%20D%20%3D%20c%3B%0D%0A

Related Issues:

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScript

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions