在TypeScript中如何防止属性被添加到一个空对象中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在TypeScript中如何防止属性被添加到一个空对象中?相关的知识,希望对你有一定的参考价值。

TypeScript类型检查器似乎接受以下代码。为什么会这样?我可以以某种方式使它更严格吗?

const foo: {} = {bar: 123}
答案
const foo: { [index: string]: never } = {} // no error
const bar: {[index : string]: never } = {a:1} // error

游乐场

另一答案

任何对象都可以作为{}的符号。但通常情况下,当你尝试使用它后,你将没有来自类型的属性。

const foo: {} = {bar: 123}
foo.bar // error : Property 'bar' does not exist on type '{}'

你应该先定义一个类型,或者在你的声明中推断类型。

// with a type (an interface would also work)
type Foo = {
    bar: number;
}

const foo: Foo = {bar: 123};
foo.bar // type: number

// with inference :
const foo = {bar: 123};
foo.bar // type: number
另一答案

类型 对象 类型是相当广泛的。它既可以是空的,也可以是有属性的,这是完全有效的。

我建议使用 无效 类型代替空对象,如果您希望验证对象属性,则用类型或接口代替。

请看 TypeScript游乐场

interface Foo {
    bar: number
}

var foo: Foo | null = null

foo = {
    bar: 123
}
另一答案

我解决了这个问题,将类型定义为 Record<any, never>.

const foo: Record<any,never> = {} // this works
const bar: Record<any,never> = {bar: 123} // this creates error as expected

以上是关于在TypeScript中如何防止属性被添加到一个空对象中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jsdom和typescript防止“属性'...'在'Global'类型上不存在”?

如何将样式化组件作为属性添加到 TypeScript 中的另一个样式化组件?

如何防止Item添加到DataGrid?

使用组件属性的 Mixin(Vue 2、TypeScript)

如何防止热键 ` 被添加到 html 表单输入中?

如何防止(卸载)TypeScript 安装并将其自己的 @types 引用到 AppData\Local