提问人:Antti Keskinen 提问时间:11/17/2023 最后编辑:Antti Keskinen 更新时间:11/20/2023 访问量:20
尝试在接口定义中使用计算属性名称会导致 ts(1170)
Attempting to use computed property name in an interface definition results in ts(1170)
问:
我遇到了来自 TypeScript 的编译器错误,我不完全确定如何修复它。我知道 和类似的机制存在,我可以用它们来代替。我想了解的是究竟是什么导致了接口定义中的编译错误ts(1170)。Pick
Omit
INewType
最终目标是能够编写 Mongoose 和 MongoDB 查询,这些查询使用 $lookup 和 $project,从而捕获潜在的重构尝试,其中查询的主体尚未调整为匹配。
下面展示了一个代码展示,以说明该问题:
function nameof<T>(key: keyof T): keyof T {
return key;
}
interface ISubType {
fieldA: string;
}
interface ISomeType {
id: string;
name: string;
subType: ISubType;
}
// This works fine; the resulting object has two fields
// named after the field names from the other types
const newObject = {
[nameof<ISomeType>('name')]: 'Foo',
[nameof<ISubType>('fieldA')]: 'Bar'
}
// This results in ts(1170)
interface INewType {
[nameof<ISomeType>('id')]: string;
}
链接到 TS Playground。
编辑#1:修复了代码示例中缺少的括号和双冒号。
@jcalz:的形状是。括号表示法生成计算的属性名称,而不是索引签名。我调整了问题主题以更好地表示意图。如果需要,我可以尝试添加 Mongoose 模式定义和查询,但这会使问题的代码示例膨胀。newObject
{ 'name': 'Foo', 'fieldA': 'Bar' }
答: 暂无答案
评论
newObject
{ [x: string]: string; fieldA: string; }
name
ISomeType
INewType
{ [x: string]: string }