我已经编写了以下模块,但是导入它无法按预期方式进行。文件(为简化起见缩写):
templates.js
'use strict'; export default class Templates { constructor (args) { this.files = [{ name: `${args.name}.js`, path: 'src/', content: '' }]; /* code omitted */ } };
我正在尝试像这样使用它:
index.js
import Templates from './templates' const opts = {name: 'app'}; /* code ommited */ console.log('Templates >>', typeof Templates); console.log('Templates >>', new Templates()); let tmpls = new Templates(opts); console.log(tmpls.files[0].name);
但是我在控制台中收到以下错误跟踪。
npm ERR! Linux 3.16.0-38-generic npm ERR! argv "/home/wesleycoder/.nvm/versions/node/v5.1.0/bin/node" "/home/wesleycoder/.nvm/versions/node/v5.1.0/bin/npm" "init" npm ERR! node v5.1.0 npm ERR! npm v3.3.12 npm ERR! Cannot read property 'name' of undefined
是的,这是~/.npm-init
谁可能问的脚本。
编辑: 感谢@low_ghost的有用的答复。
我发现我的问题不是关于导出和导入类。实际上,这是关于将参数传递给此类,而不是关于不传递参数。因此,为了简洁起见,我更改了标题。
console.log(new Templates())
在我的代码中,无任何参数是故意的。我试图解决的错误是关于实例化对象并获取文件数组的,但是我直接从commander.js
库中传递了参数,并且传递的参数对于该任务来说是“过度杀伤力”,因此我通过采用输入来简化参数从commander.js
一个空对象中的一个属性中分配每个对象,然后将其分配给一个空对象,然后将该对象沿构造函数传递,这使我可以readline-sync
从未传递的选项中读取输入,并使脚本更加出色,在此之后一切正常。
如果commander.js
有任何选项可以传递选项,而又不增加库属性的重量,那会很好。
对于那些感兴趣的人,该项目在github上。您可以分叉,进行自己的变形和共享,我发现使用~/.npm-init
有助于启动需要更特定环境的项目。
Edit2:
毕竟commander.js
没有用,因为我无法将参数沿npm init
命令传递给它自己的脚本。
由于构造函数调用中缺少参数,因此名称未定义。最好的解决方案,根据意图,将是检查名称的存在和类型:
'use strict'; export default class Templates { constructor (args) { this.files = (args.name && typeof arg.name === "string") ? [{ name: `${args.name}.js`, path: 'src/', content: '' }] : []; /* other code */ } };
如果您对三元协议没问题。如果arg.name不存在或不是字符串,则返回空数组this.files。
编辑:
或者,如madox2建议的那样,提供默认值。虽然我会使用默认名称而不是整个args对象。喜欢:
constructor({ name = 'defaultName', ...otherArgs } = {})
这样,如果您致电:
new Templates({ dir: 'repo' })
您仍将使用默认名称,并且如果按字面意义使用省略号,则可以从otherArgs.dir获取dir。= {}部分允许调用
new Templates()
仍获得默认名称。