Поскольку B индексируется как [s: string]
, считается, что любой допустимый строковый ключ приведет к доступу к значению { bar: number }
. Так, с
const b: B = {};
const bb = b.foo?.bar;
он думает, что свойство foo
всегда будет существовать - оно никогда не потерпит неудачу и превратится в undefined
через необязательное сцепление.
В отличие от A :
interface A {
foo?: { bar: number };
}
Поскольку свойство foo
здесь не является обязательным, оно не обязательно существует (для Typescript), поэтому ?.
может привести к тому, что свойство не будет найдено и undefined
является результатом.
Вы можете дать понять, что не все свойства в B
обязательно будут иметь объект bar
, чередуя с undefined
в типе значения объекта:
interface B {
[s: string]: { bar: number } | undefined;
}
, в результате чего bb
набирается как number | undefined
.