尝试在接口定义中使用计算属性名称会导致 ts(1170)

Attempting to use computed property name in an interface definition results in ts(1170)

提问人:Antti Keskinen 提问时间:11/17/2023 最后编辑:Antti Keskinen 更新时间:11/20/2023 访问量:20

问:

我遇到了来自 TypeScript 的编译器错误,我不完全确定如何修复它。我知道 和类似的机制存在,我可以用它们来代替。我想了解的是究竟是什么导致了接口定义中的编译错误ts(1170)。PickOmitINewType

最终目标是能够编写 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' }

TypeScript 猫鼬

评论

0赞 jcalz 11/17/2023
(1) 请确保这是一个没有错别字的最小可重复示例。请考虑在 IDE 中对其进行测试。(2) 您的预期类型是什么?它实际上和那里没有任何关系。你说它“工作正常”,但考虑到实际发生的情况,我不确定如何将其翻译成.你可以把它定义为 ,但我猜这不是你想要的。newObject{ [x: string]: string; fieldA: string; }nameISomeTypeINewType{ [x: string]: string }

答: 暂无答案