gpt4 book ai didi

typescript - 将 Typescript Record 或类字典类型与固定键类型合并?

转载 作者:行者123 更新时间:2023-12-03 18:40:34 29 4
gpt4 key购买 nike

有没有办法扩展内置的 Record (或 { [key:string]: string } 接口(interface)),您还定义了一些固定键及其类型?

假设我们有这个:

const otherValues = {
some: 'some',
other: 'other',
values: 'values',
}

const composedDictionary = {
id: 1,
...otherValues
}

我想为composedDictionary 定义一个接口(interface),其中 id键入为 number (仅限数字)和其他所有内容为 string .

我试过这个:
interface ExtendedRecord extends Record<string, string> {
id: number;
}

还有这个:
interface MyDictionary {
[key: string]: string;
id: number;
}

两者都失败了:
Property 'id' of type 'number' is not assignable to string index type 'string'
有任何想法吗?

最佳答案

理想情况下,索引签名应该反射(reflect) 任意 可能的索引操作结果。如果您访问 composedDictionary使用不可检查的字符串键,结果可能是 number如果是 string实际上是 'id' (例如: composedDictionary['id' as string] ,打字会说这是 string 但在运行时它原来是 number )。这就是类型系统在这方面与你争吵的原因,这是一种不一致的类型。

您可以将索引定义为与所有属性一致:

interface MyDictionary {
[key: string]: string | number;
id: number;
}

typescript 对索引和属性一致性的检查存在漏洞。该循环孔是交叉类型:
type MyDictionary  = Record<string, string> & {
id: number
}


const composedDictionary: MyDictionary = Object.assign({
id: 1,
}, {
...otherValues
});

编译器仍然会在赋值时与你发生冲突,而在类型系统中创建这种不一致对象的唯一方法是使用 Object.assign

关于typescript - 将 Typescript Record 或类字典类型与固定键类型合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371839/

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