【问题标题】:Declared object in a constant only with the exact properties defined in the type仅在具有类型中定义的确切属性的常量中声明对象
【发布时间】:2019-04-10 12:50:55
【问题描述】:

我们在基于 JS 的应用程序中使用 typescript 和 JSDoc,只是为了定义我们在函数中使用的参数的类型。 在特定情况下,我们希望拥有具有已定义结构的对象,并且我们需要确保在特定类型下声明的每个对象都仅具有预期的属性

type Keys = 'foo' | 'bar';

type Things = {
  [K in Keys]: Thing;
}

interface Thing {
  a: string;
  b: string;
}

当创建Things 类型的对象时,我希望它只具有Thing 中定义的属性

const object = /** @type {Things} */ ({
  foo: { a: 'foo_a', b: 'foo_b' },
  bar: { a: 'bar_a', b: 'bar_b' }
})

但实际上,我们可以声明一个属性abc 而不会受到 Typescript 的任何抱怨。只有在尝试访问该对象的属性时,我们调用了类型声明中不存在的属性,它才会抱怨。例如,如果我们使用object.abc,它会抱怨。

错误

正如你想象的那样,这会触发一个错误:

object.abc // abc is not defined in type Things

没有错误

添加类型中未定义的abc,是否不会触发TS错误:

const object = /** @type {Things} */ ({
  foo: { a: 'foo_a', b: 'foo_b' },
  bar: { a: 'bar_a', b: 'bar_b' },
  abc: { a: 'abc_a', b: 'abc_b' },
})

我想在创建Things 类型的对象时防止在类型属性中声明未定义。

游乐场

TypeScript playground example

有人遇到过类似的问题吗?

谢谢

【问题讨论】:

  • const object: Things = ... 似乎按预期工作
  • @ExplosionPills 谢谢,如果我们使用“.ts”文件但我们使用“.js”文件,它会起作用。

标签: javascript typescript typescript-typings jsdoc


【解决方案1】:

正如@ExplosionPills 所说,在:

const object = /** @type {Things} */ ({
    foo: { a: 'foo_a', b: 'foo_b' },
    bar: { a: 'bar_a', b: 'bar_b' },
    abc: { a: 'abc_a', b: 'abc_b' } // This shouldn't be allowed. Not defined in Keys 
})

“object”没有被定义为“Things”类型,因此它不会出错,因为object隐含的类型为any,所以你可以分配任何你想要的东西。

您需要将代码更改为:

const object : Things = /** @type {Things} */ ({
    foo: { a: 'foo_a', b: 'foo_b' },
    bar: { a: 'bar_a', b: 'bar_b' },
    abc: { a: 'abc_a', b: 'abc_b' } // This will now be highlighted as an error 
})

只有这样做才允许将 Things 类型的对象分配给对象。进行此更改后,您将看到 Typescript 抱怨该错误。

【讨论】:

  • 谢谢!我们没有使用 .ts 文件,因此我们不能使用此解决方案。我们将 TypeScript 与 JSDocs 一起使用。我们只使用“.ts”文件来定义接口。不知道有没有办法解决这个问题。
  • 添加“:Things”就像你定义一个字符串一样,即“:string”,那么为什么不能使用它呢?如果不添加“:Things”,您的代码将完全按照其要求执行,即创建任何类型的 javascript 对象。
  • 对象在 .JS 文件中创建,而接口在 .TS 文件中创建。我猜我们的 JSDocs 设置不允许这样做。感谢本的输入。
  • 没问题@Ricard,希望你能找到解决办法。
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多