Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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_Module - Fatal编程技术网

Javascript 通过将常量导出为对象来释放类型信息

Javascript 通过将常量导出为对象来释放类型信息,javascript,typescript,module,Javascript,Typescript,Module,以下展开对象的方法提示错误: 类型.ts 接口SetAppDataAction{ type:typeof SET\u APP\u DATA//必须完全是字符串!而不仅仅是任何字符串 } 常量设置应用程序数据=设置应用程序数据 导出默认值{SET_APP_DATA} action.ts 从./types导入类型; const setAppData=appData:IAppDataState:SetAppDataAction=>{ 返回{ type:types.SET\u APP\u DATA,//

以下展开对象的方法提示错误:

类型.ts

接口SetAppDataAction{ type:typeof SET\u APP\u DATA//必须完全是字符串!而不仅仅是任何字符串 } 常量设置应用程序数据=设置应用程序数据 导出默认值{SET_APP_DATA} action.ts

从./types导入类型; const setAppData=appData:IAppDataState:SetAppDataAction=>{ 返回{ type:types.SET\u APP\u DATA,//Typescript错误:TS2322:类型“{SET\u APP\u DATA:string;}”不可分配给类型“SET\u APP\u DATA” 有效载荷:appData } } 谁能解释一下这里发生了什么事?类型信息是否可能因包装在对象中而丢失?输入before:完全设置应用程序数据,之后仅输入字符串


是的,这很正常。在对象中放置常量会使对象可变!对象属性具有不太特定的类型。您可以使用以下方法防止这种情况:

但是,我建议您根本不要默认导出对象!而是使用名称导出:

// types.ts
export const SET_APP_DATA = "SET_APP_DATA";

是的,这很正常。在对象中放置常量会使对象可变!对象属性具有不太特定的类型。您可以使用以下方法防止这种情况:

但是,我建议您根本不要默认导出对象!而是使用名称导出:

// types.ts
export const SET_APP_DATA = "SET_APP_DATA";

另一种解决方案是使用显式类型而不是依赖类型推断

interface SetAppDataAction {
    type: typeof SET_APP_DATA // need to be exactly the string! not just any string
}

const SET_APP_DATA = "SET_APP_DATA"
const objectToExport: { SET_APP_DATA: typeof SET_APP_DATA } =  { SET_APP_DATA }
export default objectToExport


另一种解决方案是使用显式类型而不是依赖类型推断

interface SetAppDataAction {
    type: typeof SET_APP_DATA // need to be exactly the string! not just any string
}

const SET_APP_DATA = "SET_APP_DATA"
const objectToExport: { SET_APP_DATA: typeof SET_APP_DATA } =  { SET_APP_DATA }
export default objectToExport


正是我要找的!这是个好建议。有时我确实喜欢导出这样一个默认对象,当它主要用作单个值时,在这种情况下,通常需要对象。冻结它。这正是我要找的!这是个好建议。有时我确实喜欢导出这样一个对象的默认值,当它主要用作单个值时,在这种情况下,通常需要对其进行object.freeze。