// @target: es2015
// @noPropertyAccessFromIndexSignature: true

interface A {
    foo: string
}

interface B {
    [k: string]: string
}

interface C {
    foo: string
    [k: string]: string
}

declare const a: A;
declare const b: B;
declare const c: C;
declare const d: C | undefined;

// access property
a.foo;
a["foo"]

// access index signature
b.foo;
b["foo"];

// access property
c.foo;
c["foo"]

// access index signature
c.bar;
c["bar"];

// optional access property
d?.foo;
d?.["foo"]

// optional access index signature
d?.bar;
d?.["bar"];
