我正在使用Typescript构建一个包含100个独立ts文件的大型库.以前我使用导出模块XXX(稍后重命名为导出命名空间XXX)用于我的所有类,但正如书中所说,这不是推荐的方式,我应该使用import.
所以我尝试导入.这工作得很好:
import * as mylib from "./source/source.ts";
Run Code Online (Sandbox Code Playgroud)
但由于我有100个文件,我不想为所有这些文件添加这样的行.我想通过mylib变量访问所有类.
所以我尝试了这个:
import * as mylib from "./source/";
Run Code Online (Sandbox Code Playgroud)
但是一旦我这样做,我得到:找不到模块'./source/'
有没有办法从一个包含多行文件的文件夹中导入所有类?
让我说我有一个打字稿文件Utils与一堆导出函数:
export function utilOne(){}
export function utilTwo(){}
Run Code Online (Sandbox Code Playgroud)
我将index.d.ts文件添加到此文件夹中,我从Utils文件中导出*:
export * from './Utils';
Run Code Online (Sandbox Code Playgroud)
在我的其他类中,我想通过utils命名空间访问函数utilOne和utilTwo,如:
utils.utilOne();
Run Code Online (Sandbox Code Playgroud)
我知道我可以像这样导入它:
import * as utils from "./Utils";
Run Code Online (Sandbox Code Playgroud)
但是,由于我将使用utils很多,我希望能够在命名空间中导出utils,例如:
export {* as utils} from './Utils'; // this doesn't work
Run Code Online (Sandbox Code Playgroud)
然后使用:
import * from "./Utils";
Run Code Online (Sandbox Code Playgroud)
但是导出{*as utils}不起作用.我可以把Utils的所有功能都放到模块"utils"中并导出它,但我不确定这是不是一个好习惯.有没有正确的方法来做到这一点?
假设我有一个带有一些属性dataItems的基类,它是DataItem的数组:
export class BaseClass{
dataItems:DataItems[];
}
Run Code Online (Sandbox Code Playgroud)
然后我有几个扩展BaseClass的类,它们的dataItems属性是扩展DataItems的某个类的数组:
export class BetterClass extends BaseClass{
dataItems:BetterDataItems[];
}
export class BestClass extends BaseClass{
dataItems:BestDataItems[];
}
Run Code Online (Sandbox Code Playgroud)
现在我想在BaseClass中添加一个方法,它创建dataItems并将它们添加到数组中.是否可以在BaseClass中完成所有这些操作?我需要创建BetterDataItems或BestDataItems的实例,具体取决于使用的类.
目前我只是补充说:
dataItemType: typeof DataItem;
Run Code Online (Sandbox Code Playgroud)
属性到BaseClass并在扩展BaseClass的每个类中使用适当的数据项类型覆盖此变量:
在BetterClass中:
dataItemType: typeof BetterDataItem = BetterDataItem;
Run Code Online (Sandbox Code Playgroud)
在BestClass:
dataItemType: typeof BestDataItem = BestDataItem;
Run Code Online (Sandbox Code Playgroud)
然后,在BaseClass中我这样做:
var dataItem = new this.dataItemType();
Run Code Online (Sandbox Code Playgroud)
这很好但我的问题是 - 是否可以避免拥有dataItemType财产?我可以找到一种类型的dataItems数组并创建一个新实例吗?
谢谢!
继续这个问题:任务管理器显示内存泄漏,但Heap快照没有
我设法创建了一个非常简单的例子,它说明了这个漏洞,这里是完整的源代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>svg test</title>
<script type="text/javascript">
var svg;
var interval;
var svg;
window.onload = function(){
createSVG();
start();
}
function start(){
interval = setInterval(createElements, 100);
}
function createSVG(){
var div = document.getElementById("svgdiv");
div.innerHTML = "";
svg = createSvgElement("svg");
svg.style.position = "absolute";
svg.style.width = "600px";
svg.style.height = "500px";
svg.setAttribute("version", "1.1");
div.appendChild(svg);
createElements();
}
function createElements(){
removeElements();
for(var i = 0; i < 500; i++){
var element = createSvgElement("circle"); …Run Code Online (Sandbox Code Playgroud) 让我们说我有一节课:
module MyModule {
export class MyClass {
x:number;
y:number;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个字符串,"x".如何检查MyClass是否具有属性"x"?
如果我创建一个MyClass实例然后执行:
myClassInstance.hasOwnProperty("x");
Run Code Online (Sandbox Code Playgroud)
它返回false,除非x设置了默认值.但我不想为每个属性设置默认值.如果我甚至可以在不创建MyClass实例的情况下做到这一点,那将是最好的.
我按照本教程使用webpack创建了Typescript项目.由于我有很多模块,我将index.d.ts添加到我的src/components文件夹中,我将导出所有模块:
export {Module1} from "./Module1";
export {Module2} from "./Module2";
export {Module3} from "./Module3";
Run Code Online (Sandbox Code Playgroud)
我将index.d.ts添加到tsconfig.json文件中:
"files": [
"./src/components/index.d.ts"
]
Run Code Online (Sandbox Code Playgroud)
然后,在index.tsx中,在src文件夹中,我导入:
import * as MyModule from "./components/";
Run Code Online (Sandbox Code Playgroud)
代码提示工作正常,所以我认为所有路径都可以.但是,当我运行webpack时,我收到此错误:
找不到模块:错误:无法解析目录'./components'
据我所知,webpack找不到这个index.d.ts文件.我尝试将d.ts添加到webpack.config.js扩展,如此处所述,但后来我收到了不同的错误消息.我错过了什么吗?
我每5秒运行一次大量的JavaScript,任务管理器显示内存使用量不断增加.但是Heap快照没有.如果我停止脚本,大约半分钟两分钟后内存就会被清除.
更新:
如果我长时间离开脚本,内存会一直增加,直到浏览器崩溃.我还尝试运行chrome dev工具的时间线测试,它们也没有显示内存使用量的增加,与Heap快照相同.所以我想这是一种泄漏,但我无法理解泄漏的是什么.
另一件我无法确认的事情,因为我无法安装以前的Chrome版本,因为我不记得之前发生的事情(<24个Chrome版本).IE10在不增加内存的情况下运行此测试.这可能是新Chrome的问题吗?
我按照本教程成功设置了 typescript+webpack(无反应)。一切都很好,直到我将 index.d.ts 文件添加到我的组件文件夹中,我用它来导出我的所有模块,例如:
export * from "./MyClass1";
export * from "./MyClass2";
export * from "./MyClass2";
Run Code Online (Sandbox Code Playgroud)
然后我导入它:
import * as MyLib from "./components";
Run Code Online (Sandbox Code Playgroud)
代码提示和一切在 sublime 编辑器中正常工作。
最初,当我运行它时,我有:
无法解析“文件”或“目录”。/components
所以我在 webpack.config.js 的扩展中添加了 d.ts:
resolve: {
extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js", ".d.ts"]
},
Run Code Online (Sandbox Code Playgroud)
现在,当我运行 webpack 时,出现此错误:
Typescript 没有为 [...]\index.d.ts 发出任何输出
我应该如何解决这个问题?
我有:
classA
classB extends ClassA
classC extends ClassB
Run Code Online (Sandbox Code Playgroud)
我在classC上创建了对象:
var myClassC= new classC();
Run Code Online (Sandbox Code Playgroud)
ClassA有这个方法:
public get className(): string {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}
Run Code Online (Sandbox Code Playgroud)
如果我调用myClassC.getClassName(),则返回"ClassC"字符串;
我需要的是获得基类的所有类的列表:ClassC,ClassB,ClassA.有没有办法做到这一点?