Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅具有类型中定义的确切属性的常量中声明的对象_Javascript_Typescript_Typescript Typings_Jsdoc - Fatal编程技术网

Javascript 仅具有类型中定义的确切属性的常量中声明的对象

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

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

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,希望你能找到解决方案。