我有一个定义对象的js文件:
var schema = {
"date": Date.now(),
"someOtherField": 5 + 6,
"aMoreComplexField: {
"foo": "bar"
}
}
现在在我的打字稿代码中,我想加载这个文件,并希望在变量中包含变量模式的内容。
伪代码:
function loadSchema(schemaFile1, anotherSchemaFile) {
let schema = someHowLoadFile(schemaFile);
schema = Object.assign(schema, someHowLoadFile(anotherSchemaFile));
// do some additional stuff here with content of schema
return schema;
}
但我怎样才能做到这一点?我可以定义模式文件的内容,所以如果内容应该是var schema = {}
之外的其他内容,请告诉我该怎么做。我试图放export {}
和return {}
,但我的IDE直接告诉我这不正确。
在模式中调用逻辑,如Date.now()
,我不能只使用JSON文件。
答案 0 :(得分:0)
您可以尝试将该文件的内容导出为常量,然后在组件中导入。
创建schema.ts
export const SCHEMA = {
"date": Date.now(),
"someOtherField": 5 + 6,
"aMoreComplexField: {
"foo": "bar"
}
}
然后导入并使用。 例如,在你的app.ts中:
import { SCHEMA } from 'schema.ts';
console.log('date is', SCHEMA.date);
答案 1 :(得分:0)
我目前正在尝试几种方法,如何最好地将常量外包,因为这真是一个奇迹,我发现更多地使用常量可以简化代码,并在几乎每种意义上提高其质量。为了便于概述和将来的灵活性,我希望将它们集中在一个单独的文件或文件夹中,但是如何以最有效的方式做到这一点?
XML通过JSON已经过时了,这也不令人满意,这是一个非常狭窄的标准,除了基本数据类型之外什么也不允许,而且非常精致。最糟糕的一点是放松Typescript的类型定义和检查,这为此类提供了特别出色的服务,防止了错误,并为支持我的大脑老化提供了智慧。因此,非常需要将外包部分写为Typescript对象,并使用它们,以将它们加载到任何其他脚本的任何变量中。
不能使用<script>
元素,因为它没有提供对其内容的任何访问,也没有对如何集成产生任何影响,也无法在没有DOM的上下文中使用。关于第二个<document>
对象和DomParser
来说,是同一回事,对于这样的用法来说非常复杂且毫无价值。已知的模块系统要好一些,但是它们的优点远远超过了它们的优先级,限制和对所有这些知识的理解的需要,这也不是一种简单的方法,我认为这不适合浏览器。
我发现了一种绝妙的方法,绝对简单,既不需要上面的任何技巧,也不需要任何专门知识,就可以轻松地进行监视和调试,从而提供各种灵活性,将数据放置在所需的位置,可以访问任何类型的数据。脚本或模块类型,使用健壮的老式基本技术,可在10年前使用的所有浏览器版本上使用,并且在短短一行内仅包含一条语句,而在摘要中,不仅适用于常量,还适用于所有内容可以想象的。
魔术词是Function()
,大写字母'F'
首先,我们需要将脚本文件的内容作为字符串加载到节点槽fs.readFileSync()
或浏览器槽httpRequest
对象或Electron.ipcXXX
中对象或其他任何东西。假设已经完成,文件看起来像这样,在我的情况下是常量结构。
var script : string; // holding the content of the file
包含类似内容
"defs = {set1: {a: 1, b: 2}, set2: {a: 3, b: 4}}"
放置有效载荷的本地目标
var defs = {}; // an empty object to be filled
被应用到谷底
Function("defs", script)(defs);
Magic Magic,在调试时,将打开一个新选项卡,其中显示一个临时脚本,名称为“ VM123”,其中包含已创建的名为“ anonymous”的函数,参数为“ defs”,其中包含该脚本的全部内容。加载的脚本文件,以及在第一组参数中传递的脚本文件,我们正在回跳。到目前为止,它在语法上已被接受,将被执行,我们将再次进入,观察它是如何工作的。这次,它将使用第二组参数,在这种情况下,将使用提供的空目标对象,然后将其填充我们想要的内容。
唯一的限制是,在加载的脚本中,必须声明相同相同的变量,这样将替换传递的变量,从而导致结果为空。
两者都不 "var defs = {…}"
也不 "const defs = {…}"
也 "let defs = {…}"
但仅 "defs = {…}"
在Javascript中,无需任何声明就可以接受这样的名称,但是在Typescript中,类型检查器会提出抗议,可以通过//@ts-ignore
使其静音,或者最好通过declare var defs;
使其满意。
但是,当我的常量结构需要一些上下文,使用其他常量,看起来像这样吗?
"defs = {set1: {a: arr[2], b: 2}, set2: {a: 3, b: arr[5]}}"
这并没有比以前更难,只需要第二个参数,即名为“ arr”的必需数组,该参数不会受到影响,而仅提供所需的上下文。
var arr = [9,8,7,6,5,4,3,2,1,0];
Function("defs", "arr", script)(defs, arr);
该方法可以很好地处理我尝试过的所有事情,例如从Typescript编译而来的,我想所有到处都可以想到的东西。当执行Typescript编译的东西时,它会按成员方式填充目标对象,允许根据需要将它们与其他对象混合在一起,或者根据选择的目标将它们分开。换句话说,它不受给定名称和/或类型的约束,提供了概念的另一个方面,真是一个很好的愿景。
如果嵌入了子对象,则对象内部的某些对象可以预先传递,也可以不传递,如果加载的脚本有选择地处理它们,如每次编译所示:
…(arg || arg = {})…
这目前正在推翻和革新我对文件概念的理解和思考,提出了更棘手的问题,为什么还要再使用任何模块,为什么还要浪费时间来学习它们呢?
玩得开心。