打字稿:在变量中加载文件内容

时间:2018-05-07 13:54:56

标签: typescript

我有一个定义对象的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文件。

2 个答案:

答案 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 = {})…

这目前正在推翻和革新我对文件概念的理解和思考,提出了更棘手的问题,为什么还要再使用任何模块,为什么还要浪费时间来学习它们呢?

玩得开心。