Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
如何将对象中所有元素的类型(typeof)分配给JavaScript | Typescript中的变量?_Javascript_Reactjs_Typescript_Redux - Fatal编程技术网

如何将对象中所有元素的类型(typeof)分配给JavaScript | Typescript中的变量?

如何将对象中所有元素的类型(typeof)分配给JavaScript | Typescript中的变量?,javascript,reactjs,typescript,redux,Javascript,Reactjs,Typescript,Redux,我有一个javascript对象,看起来像 我试图将对象中所有元素的类型分配给我面临问题的变量 然而,当我单独提到常量时,我能够分配它,而不是在第二个代码段的对象中使用它 const a=Object.freeze({ 删除项目:“删除项目” 添加项目:“添加项目” }); //如何指定上述对象中所有元素的类型 常数b=类型?//上述对象中的所有属性((此处面临问题)); //如果你愿意,我可以做 const REMOVE_ITEM='REMOVE_ITEM'; const ADD_ITEM=

我有一个javascript对象,看起来像

我试图将对象中所有元素的类型分配给我面临问题的变量

然而,当我单独提到常量时,我能够分配它,而不是在第二个代码段的对象中使用它

const a=Object.freeze({
删除项目:“删除项目”
添加项目:“添加项目”
});
//如何指定上述对象中所有元素的类型
常数b=类型?//上述对象中的所有属性((此处面临问题));
//如果你愿意,我可以做
const REMOVE_ITEM='REMOVE_ITEM';
const ADD_ITEM='ADD_ITEM';

常数b=删除项的类型|添加项的类型
您可以使用TypeScripts
作为常量
符号()

const a=Object.freeze({
删除项目:“删除项目”,
添加项目:“添加项目”
}作为常量);
//分配类型
常数b:typeof a={}如有;//您可以将`{}作为任何`忽略—仅在这里举例
b、 //类型为{REMOVE_ITEM:'REMOVE_ITEM',ADD_ITEM:'ADD_ITEM'}
b、 删除_项;//='删除项目'
b、 添加_项;//='添加项目'
//解构
const{REMOVE_ITEM,ADD_ITEM}=a;
删除_项;//='删除项目'
添加_项;//='添加项目'

下面是一个示例,以便您可以查看正在运行的类型

您可以使用TypeScripts
作为常量
符号()

const a=Object.freeze({
删除项目:“删除项目”,
添加项目:“添加项目”
}作为常量);
//分配类型
常数b:typeof a={}如有;//您可以将`{}作为任何`忽略—仅在这里举例
b、 //类型为{REMOVE_ITEM:'REMOVE_ITEM',ADD_ITEM:'ADD_ITEM'}
b、 删除_项;//='删除项目'
b、 添加_项;//='添加项目'
//解构
const{REMOVE_ITEM,ADD_ITEM}=a;
删除_项;//='删除项目'
添加_项;//='添加项目'

下面是一个示例,以便您可以查看正在运行的类型

据我所知,您正在尝试导出
类型
以在另一个文件中使用它。这很容易:

包含类型定义的文件(myType.ts/myType.d.ts):

要在其中使用该类型的文件:

import { MyType } from './myType' // should be in the same folder, otherwise correct the path

const myVar: MyType = false // error
const myVar: MyType = { foo: false, bar: 'foo' } //working
您可以在运行时不定义任何类型,因为类型将在传输时被删除。但您可以定义一个
enum
,并使用它来定义您的类型:

enum MyEnum {
  FOO_BAR = 'foo_bar',
  LORD_OF = 'the_rings'
}
type MyOhterType = {
  fooBar: MyEnum
}

const myOtherVar: MyOtherType = {
  fooBar: MyEnum.FOO_BAR
}

据我所知,您正在尝试导出一个
类型
,以便在另一个文件中使用它。这很容易:

包含类型定义的文件(myType.ts/myType.d.ts):

要在其中使用该类型的文件:

import { MyType } from './myType' // should be in the same folder, otherwise correct the path

const myVar: MyType = false // error
const myVar: MyType = { foo: false, bar: 'foo' } //working
您可以在运行时不定义任何类型,因为类型将在传输时被删除。但您可以定义一个
enum
,并使用它来定义您的类型:

enum MyEnum {
  FOO_BAR = 'foo_bar',
  LORD_OF = 'the_rings'
}
type MyOhterType = {
  fooBar: MyEnum
}

const myOtherVar: MyOtherType = {
  fooBar: MyEnum.FOO_BAR
}

看起来您将JavaScript的
typeof
运算符与TypeScript运算符混合在一起,两者的作用并不相同

在JS中,
typeof something
将计算为一个简单的运行时字符串(例如
'number'
'string'
'object'
),然后应用程序可以使用该字符串进行比较。这不是你想要的

在TS中,
typeof
帮助您从JS变量中提取隐含的TS类型,作为一个有意义的结构-一个真正的TypeScript类型。当您想用现有的JS代码定义复杂的TS类型时,这很有用

const a = Object.freeze({
  REMOVE_ITEM: 'REMOVE_ITEM',
  ADD_ITEM: 'ADD_ITEM'
});

// ^ to TypeScript, this is similar to this type:
// Readonly<{ REMOVE_ITEM: string; ADD_ITEM: string; }>
现在,回到运行时代码。一旦提取了与
a
的键匹配的
AKey
类型,就可以在需要的地方对某些JS值和参数强制执行类型一致性:

function createActionObject(actionType: AKey) {
  return { type: actionType };
}

const action1 = createActionObject('REMOVE_ITEM');
// compiles and works as expected

const action2 = createActionObject('SOME_BAD_KEYNAME');
// TypeScript Error ->
// Type '"SOME_BAD_KEYNAME"' is not assignable to type '"REMOVE_ITEM" | "ADD_ITEM"'

最后,您不能将TS类型“分配”给JS变量,您只能描述JS变量的外观,以便TypeScript在最终传输到JS之前对其进行验证。如果试图获取一个数组,该数组列出
a
中的所有键,则需要使用传统的JS方法:

const b = Object.keys(a);
// to JavaScript: will be ['REMOVE_ITEM', 'ADD_ITEM']
// to TypeScript: string[]

// or, to get stronger typings for `b` rather than just `string[]`:

const b = Object.keys(a) as (keyof typeof a)[];
// to JavaScript: will be ['REMOVE_ITEM', 'ADD_ITEM']
// to TypeScript: ('REMOVE_ITEM' | 'ADD_ITEM')[]


看起来您将JavaScript的
typeof
运算符与TypeScript运算符混合在一起,两者的作用并不相同

在JS中,
typeof something
将计算为一个简单的运行时字符串(例如
'number'
'string'
'object'
),然后应用程序可以使用该字符串进行比较。这不是你想要的

在TS中,
typeof
帮助您从JS变量中提取隐含的TS类型,作为一个有意义的结构-一个真正的TypeScript类型。当您想用现有的JS代码定义复杂的TS类型时,这很有用

const a = Object.freeze({
  REMOVE_ITEM: 'REMOVE_ITEM',
  ADD_ITEM: 'ADD_ITEM'
});

// ^ to TypeScript, this is similar to this type:
// Readonly<{ REMOVE_ITEM: string; ADD_ITEM: string; }>
现在,回到运行时代码。一旦提取了与
a
的键匹配的
AKey
类型,就可以在需要的地方对某些JS值和参数强制执行类型一致性:

function createActionObject(actionType: AKey) {
  return { type: actionType };
}

const action1 = createActionObject('REMOVE_ITEM');
// compiles and works as expected

const action2 = createActionObject('SOME_BAD_KEYNAME');
// TypeScript Error ->
// Type '"SOME_BAD_KEYNAME"' is not assignable to type '"REMOVE_ITEM" | "ADD_ITEM"'

最后,您不能将TS类型“分配”给JS变量,您只能描述JS变量的外观,以便TypeScript在最终传输到JS之前对其进行验证。如果试图获取一个数组,该数组列出
a
中的所有键,则需要使用传统的JS方法:

const b = Object.keys(a);
// to JavaScript: will be ['REMOVE_ITEM', 'ADD_ITEM']
// to TypeScript: string[]

// or, to get stronger typings for `b` rather than just `string[]`:

const b = Object.keys(a) as (keyof typeof a)[];
// to JavaScript: will be ['REMOVE_ITEM', 'ADD_ITEM']
// to TypeScript: ('REMOVE_ITEM' | 'ADD_ITEM')[]


JavaScript根本不知道任何类型——这让我有点困惑。那么,你真正想要实现什么呢?您希望为
b
分配
REMOVE\u ITEM
的值,并且您的代码只是简单的JS-请告诉我们您是否在谈论
typescript
typesHi@messerbill,是的,我正在尝试使用typescript实现它,关于REMOVE_项或ADD_项,我只是想将REMOVE_项的类型分配给b,以便我可以将其用作类型,如果您需要任何其他详细信息,请告诉我您根本没有编写任何typescript代码。在ts中分配一个类型看起来是这样的:
const myVariable:MyType=……
Hi@messerbill,是的,正如您前面提到的,我们用“:”type来提到变量的类型,但我试图导出一个类型,以便将其用作另一个变量的类型。例:常数a=‘你好’;出口a型;常量b:a=……JavaScript根本不知道任何类型——这确实让我有点困惑