Javascript 仅具有类型中定义的确切属性的常量中声明的对象
在基于JS的应用程序中,我们将typescript与JSDoc一起使用,只是为了定义我们在函数中使用的参数类型。 在特定情况下,我们希望对象具有已定义的结构,并且需要确保在特定类型下声明的每个对象仅具有预期的属性Javascript 仅具有类型中定义的确切属性的常量中声明的对象,javascript,typescript,typescript-typings,jsdoc,Javascript,Typescript,Typescript Typings,Jsdoc,在基于JS的应用程序中,我们将typescript与JSDoc一起使用,只是为了定义我们在函数中使用的参数类型。 在特定情况下,我们希望对象具有已定义的结构,并且需要确保在特定类型下声明的每个对象仅具有预期的属性 type Keys = 'foo' | 'bar'; type Things = { [K in Keys]: Thing; } interface Thing { a: string; b: string; } 当创建类型为Things的对象时,我希望它只具有Thi
type Keys = 'foo' | 'bar';
type Things = {
[K in Keys]: Thing;
}
interface Thing {
a: string;
b: string;
}
当创建类型为Things
的对象时,我希望它只具有Things
中定义的属性
const object = /** @type {Things} */ ({
foo: { a: 'foo_a', b: 'foo_b' },
bar: { a: 'bar_a', b: 'bar_b' }
})
但实际上,我们可以通过Typescript声明一个属性abc
,而无需任何抱怨。只有在尝试访问该对象的属性时,调用类型声明中不存在的属性,它才会抱怨。例如,如果我们做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
的对象时,防止声明类型中未定义的属性
游乐场
有人遇到过类似的问题吗?
谢谢你,正如@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的对象指定给object。进行此更改后,您将看到Typescript抱怨错误。正如@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的对象指定给object。一旦进行了此更改,您将看到Typescript抱怨错误。
const-object:Things=…
似乎工作正常expected@ExplosionPills谢谢,如果我们使用的是“.ts”文件,它会工作,但是我们使用的是“.js”文件。const-object:Things=…
似乎可以工作expected@ExplosionPills非常感谢。如果我们使用的是“.ts”文件,它会工作,但我们使用的是“.js”文件。谢谢!我们没有使用.ts文件,因此无法使用此解决方案。我们将TypeScript与JSDocs一起使用。我们只使用“.ts”文件来定义接口。不确定是否有办法解决这个问题。添加“:Things”就像定义字符串一样,即“:string”,那么为什么不能使用这个呢?没有添加“:Things”,您的代码完全按照要求执行,即创建任意类型的javascript对象。该对象在.JS文件中创建,而接口在.TS文件中装箱。我想我们的JSDocs设置不允许这样。谢谢你的意见Ben。没问题@Ricard,希望你能找到解决方案。谢谢!我们没有使用.ts文件,因此无法使用此解决方案。我们将TypeScript与JSDocs一起使用。我们只使用“.ts”文件来定义接口。不确定是否有办法解决这个问题。添加“:Things”就像定义字符串一样,即“:string”,那么为什么不能使用这个呢?没有添加“:Things”,您的代码完全按照要求执行,即创建任意类型的javascript对象。该对象在.JS文件中创建,而接口在.TS文件中装箱。我想我们的JSDocs设置不允许这样。谢谢你的意见Ben。没问题@Ricard,希望你能找到解决方案。