gpt4 book ai didi

typescript - 任何类型都可以转换为 Typescript 中的数字映射

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:07 24 4
gpt4 key购买 nike

似乎 typescript 允许将任何类型转换为具有 number 类型键的映射。这是一个示例代码:

type NumberMap = {
[key: number]: string
}

type AnyType = {
foo: string
bar: boolean[]
}

const anyTypeObj: AnyType = { foo: "foo", bar: [false] }

const numberMap: NumberMap = anyTypeObj

我希望最后一行在尝试将 AnyType 分配给 NumberMap 时给我一个类型错误,但事实并非如此。但是,将对象文字直接分配给类型为 NumberMap 的变量会按预期工作并导致类型错误:

const numberMap: NumberMap = { foo: "foo", bar: [false] }

这是一个link在 typescript Playground 上使用上述代码。

为什么 typescript 允许将任何类型的对象转换为 NumberMap{ [key: number]: string } 类型有什么特别之处吗?

最佳答案

当一个对象字面量被分配给一个变量时,Typescript 会做一些额外的检查。这叫做 excess property checking .这个想法是,分配给类型不具有完全相同属性的变量的对象文字很可能是错误的。另一方面,不完全匹配的重新赋值和参数值在 Javascript 中很常见,因此当右侧表达式不是对象文字时,只要值的类型与变量的类型兼容,就允许不精确的赋值。

在您的示例中,anyTypeObjNumberMap 兼容。您可以将 anyTypeObj 视为空的 NumberMapNumberMap 的约定指定如果您通过数字键访问属性,则结果将是一个字符串。 anyTypeObj 没有数字键,因此在任何情况下都不成立。

请注意,一旦您将 anyTypeObj 分配给 numberMap,您将无法访问 foobar 通过 numberMap 的属性,因为 NumberMap 类型不声明这些属性。

编辑:margaretkru 跟进了这个问题:

why doesn't { [key: number]: string } enforce that all keys on an object must be of type number and values string? because anyTypeObj has properties with string keys so I would expect cast to NumberMap fail in that case.

我的解释是变量可以接受类型为 compatible 的任何值与变量的类型。我从子类型的角度考虑兼容性。例如:

const a: Animal = new Cow()

如果 CowAnimal 的子类,即使 Cow 具有 Animal 没有的属性,这也是可行的。

在面向对象的语言中,类型要么是类要么是接口(interface),如果 B 显式扩展,类型 B 仅被视为 A 的子类型或实现 A。但是一些语言(包括 Typescript)采取更一般的观点。 “类型”的最一般定义是对一组满足特定标准的可能值的描述。 BA 的子类型,如果 B 描述的一组值是 A 的集合的子集描述。 B 是否在其定义中命名为 A 并不重要。

NumberMap 描述了所有对象的集合,这些对象的数字属性都具有 string 类型。

AnyTypeNumberMap 的子类型,因为它的所有数字属性的类型都是 string。 (这很正常,因为 AnyType 没有数字属性)。 AnyType 上的字符串属性确实会干扰 NumberMap 的约定,因为 NumberMap 没有说明任何关于字符串属性的内容。

关于typescript - 任何类型都可以转换为 Typescript 中的数字映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52818688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com