为什么TypeScript在使用计算属性时假设所有属性都存在?

为什么TypeScript在使用计算属性时假设所有属性都存在?,typescript,Typescript,我想知道为什么TypeScript允许以下示例。我想这是有原因的,但我不明白为什么。有人能解释一下背后的想法吗?我很想更好地理解这一点 假设我有一个对象,我存储了一堆宠物信息。我将动态地添加和删除它们,并希望按名称对它们进行键控,因此我制作了如下界面: interface MyPets { [petName: string]: { name: string; species: string; age: number; } } co

我想知道为什么TypeScript允许以下示例。我想这是有原因的,但我不明白为什么。有人能解释一下背后的想法吗?我很想更好地理解这一点

假设我有一个对象,我存储了一堆宠物信息。我将动态地添加和删除它们,并希望按名称对它们进行键控,因此我制作了如下界面:

interface MyPets {
    [petName: string]: {
        name: string;
        species: string;
        age: number;
    }
}

const myPets: MyPets = {
    ernie: {
        name: 'ernie',
        species: 'dog',
        age: 5,
    }
}

// No error
console.log(myPets.chloe.species)
我会假设打字脚本会说“嘿,等等,我的宠物。克洛伊可能没有定义!!”然后冲我大喊大叫


谢谢

这是罪魁祸首。您正在告诉Typescript属性将是字符串

但是,您没有告诉它字符串将是什么。它可以是任何东西,只要它是一个字符串


Typescript无法知道您将使用什么作为键,因此它不能对您大喊大叫,否则每次您告诉它每个宠物名都有一个宠物时,它都需要对您大喊大叫。使用:

interface MyPets {
    [petName: string]: {
        name: string;
        species: string;
        age: number;
    } | undefined
}

如果您想要更严格的类型安全性,请改为。

为什么会这样说?你告诉过它财产会存在的。谢谢,这似乎是一个安全的合理方法。我想我对计算属性特性的理解不太正确。不是试图声明每个字符串都曾经存在于这个对象上(不确定为什么声明它会有用),只是试图说每个字符串都可以存在,与通常的范例相同,但如果它存在,它将具有以下结构。所以你可以做一些类似于
myPets.chloe&&myPets.chloe.species
的事情。这确实有点误导,这就是为什么我不理解反对票的原因。已经有人提议改变这种行为,但看起来这不会很快发生。使用typescript 3.7,您甚至可以使用
myPets.chloe?.species
参见:谢谢。可选链接看起来很棒。