【发布时间】: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 类型的对象时防止在类型属性中声明未定义。
游乐场
有人遇到过类似的问题吗?
谢谢
【问题讨论】:
-
const object: Things = ...似乎按预期工作 -
@ExplosionPills 谢谢,如果我们使用“.ts”文件但我们使用“.js”文件,它会起作用。
标签: javascript typescript typescript-typings jsdoc