小编Pal*_*leo的帖子

如何在TypeScript中使用导入的名称空间

我在两个单独的文件中有两个类,一个从另一个扩展.基类包含一些import使用节点模块的语句.我不清楚为什么派生类(在一个单独的文件中)不能识别基类!!! ???

有人可以澄清一下吗?

// UtilBase.ts

/// <reference path="../typings/node.d.ts" />
/// <reference path="../typings/packages.d.ts" />

import * as path from "path"; // <---- THIS LINE BREAKS THE BUILD!!!!

namespace My.utils {

    export class UtilBase {

        protected fixPath(value: string): string {
            return value.replace('/', path.sep);
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

然后

// UtilOne.ts
/// <reference path="UtilBase.ts" />

namespace My.utils {

    export class UtilOne extends My.utils.UtilBase {

    }
}
Run Code Online (Sandbox Code Playgroud)

编译后我得到:

src/UtilOne.ts(6,47): error TS2339: Property 'UtilBase' does not 
exist on type 'typeof utils'
Run Code Online (Sandbox Code Playgroud)

namespaces typescript es6-modules

29
推荐指数
1
解决办法
3万
查看次数

Lambda函数vs绑定,内存!(和表现)

我想确定哪种是等效解决方案之间的最佳实践.用例是监听事件的类的实例.Axel Rauschmayer博士更喜欢lambda的可读性.我同意他的看法.但就性能和内存消耗而言,哪个最好?

具有lambda功能

class Abc {
  constructor() {
    let el = document.getElementById("my-btn")
    if (el)
      el.addEventListener("click", evt => this.onClick(evt))
  }
  onClick(evt) {
    console.log("Clicked!", evt.target)
  }
}
Run Code Online (Sandbox Code Playgroud)

如果el垃圾收集器无法清除本地变量(此处),是否可以确认或确认?或者,现代浏览器是否能够检测到它们在闭包中未被使用?

Function.prototype.bind:

class Abc {
  constructor() {
    let el = document.getElementById("my-btn")
    if (el)
      el.addEventListener("click", this.onClick.bind(this))
  }
  onClick(evt) {
    console.log("Clicked!", evt.target)
  }
}
Run Code Online (Sandbox Code Playgroud)

没有内存问题,但所有基准测试表明它bind比闭包慢得多(这里的一个例子).

编辑:我不同意忽略性能问题的评论bind.我建议使用Chrome中的实施代码阅读此答案.它效率不高.我坚持认为:我看到的所有基准测试在所有浏览器上显示出类似的结果.

有没有办法在同一时间内使用低内存和良好的性能?

javascript lambda bind

23
推荐指数
1
解决办法
7611
查看次数

如何在TypeScript中进行运行时类型转换?

目前我正在开发一个打字稿项目,我真的很喜欢TypeScript带来的类型推断.但是 - 当从HTTP调用获取对象时 - 我可以将它们转换为所需类型,获取代码完成并在它们上编译函数编译时间,但这些会导致错误运行时

例:

class Person{
    name: string;

    public giveName() {
        return this.name;
    }

    constructor(json: any) {
        this.name = json.name;
    }
}

var somejson = { 'name' : 'John' }; // Typically from AJAX call
var john = <Person>(somejson);      // The cast

console.log(john.name);       // 'John'
console.log(john.giveName()); // 'undefined is not a function'
Run Code Online (Sandbox Code Playgroud)

虽然这很好地编译 - 并且intellisense建议我使用该函数,但它给出了运行时异常.解决方案可能是:

var somejson = { 'name' : 'Ann' };
var ann = new Person(somejson);

console.log(ann.name);        // 'Ann'
console.log(ann.giveName());  // …
Run Code Online (Sandbox Code Playgroud)

typescript

21
推荐指数
3
解决办法
3万
查看次数

如何在TypeScript中扩展JQuery函数

我正在重写TypeScript上的一些JS代码,遇到模块导入问题.例如,我想写我的toggleVisiblity功能.这是代码:

/// <reference path="../../typings/jquery/jquery.d.ts" />

import * as $ from "jquery";

interface JQuery {
    toggleVisibility(): JQuery;
}

$.fn.extend({
    toggleVisibility: function () {
        return this.each(function () {
            const $this = $(this);
            const visibility = $this.css('visibility') === 'hidden' ? 'visible' : 'hidden';
            $this.css('visibility', visibility);
        });
    }
});

const jQuery = $('foo');
const value = jQuery.val();
jQuery.toggleVisibility();
Run Code Online (Sandbox Code Playgroud)

但问题是,由于未知原因toggleVisibility没有添加到JQuery界面,因此我得到一个错误Property 'toggleVisibility' does not exist on type 'JQuery'.,虽然它看到其他方法(val,each等等).

为什么不起作用?

在此输入图像描述

jquery interface typescript es6-modules

14
推荐指数
2
解决办法
9084
查看次数

拼接后计算源图像的坐标

我使用opencv的全景拼接算法,以便将2或3个图像拼接成一个新的结果图像.

我有每个源图像中的点坐标.我需要计算结果图像中这些点的新坐标.

我在下面描述算法.我的代码类似于opencv(分支3.4)中的"stitching_detailed"示例.产生了一种result_mask类型Mat,也许是解决方案?但我不知道如何使用它.我在这里找到了一个相关的问题,但没有找到缝合.

任何的想法?

这是算法(详细代码:stitching_detailed.cpp):

找到features每个图像:

Ptr<FeaturesFinder> finder = makePtr<SurfFeaturesFinder>()
vector<ImageFeatures> features(num_images);
for (int i = 0; i < num_images; ++i)
{
  (*finder)(images[i], features[i]);
}
Run Code Online (Sandbox Code Playgroud)

制作pairwise_matches:

vector<MatchesInfo> pairwise_matches;
Ptr<FeaturesMatcher> matcher = makePtr<BestOf2NearestMatcher>(false, match_conf);
(*matcher)(features, pairwise_matches);
Run Code Online (Sandbox Code Playgroud)

重新排序图像:

vector<int> indices = leaveBiggestComponent(features, pairwise_matches, conf_thresh);
# here some code to reorder 'images'
Run Code Online (Sandbox Code Playgroud)

估计单应性cameras:

vector<CameraParams> cameras;
Ptr<Estimator> estimator = makePtr<HomographyBasedEstimator>();
(*estimator)(features, pairwise_matches, cameras);
Run Code Online (Sandbox Code Playgroud)

转换为CV_32F: …

c++ opencv image-processing computer-vision image-stitching

8
推荐指数
1
解决办法
473
查看次数

TypeScript 中“只读”的用法

用法 1:函数声明其参数不会被修改

这种用法非常简单:作为一个合约,函数doSomething声明它不会改变接收到的参数。

interface Counter {
  name: string
  value: number
}

function doSomething(c: Readonly<Counter>) {
  // ...
}

let c = {
  name: "abc",
  value: 123
}
doSomething(c)
// Here we are sure that 'c.name' is "abc" and 'c.value' is '123'
Run Code Online (Sandbox Code Playgroud)

用法 2:工厂声明其输出不可修改

使用此代码:

interface Counter {
  readonly name: string
  readonly value: number
  inc(): number
}

function counterFactory(name: string): Counter {
  let value = 0
  return {
    get name() {
      return name
    },
    get value() {
      return value …
Run Code Online (Sandbox Code Playgroud)

readonly typescript

6
推荐指数
2
解决办法
8152
查看次数

在调用构造函数之前是否可以知道'this'对象?

在ES6类之前,函数可以用作构造函数:

function MyClass(a, b) {
}
Run Code Online (Sandbox Code Playgroud)

然后,以下代码相当于经典实例化(如let thisObj = new MyClass("A", "B")):

let thisObj = Object.create(MyClass.prototype)
// Here we know the `this` object before to call the constructor.
// Then, the constructor is called manually:
MyClass.call(thisObj, "A", "B")
Run Code Online (Sandbox Code Playgroud)

...这种技术是this在调用构造函数之前知道对象的一种方法.但是Function.prototype.call()不适用于ES6类构造函数.

有了ES6,我们有Reflect.construct():

let thisObj = Reflect.construct(MyClass, "A", "B");
Run Code Online (Sandbox Code Playgroud)

但它没有提供在this创建对象后调用构造函数的方法.

是否仍然可以使用ES6课程?

我的用例

我需要将此功能从ES5保留到ES6以获得框架.该框架负责实例化组件(这是ES6类).组件可以从其构造函数创建子组件(在组件树中,此处没有继承).然后,子组件可以查询框架以从其自己的构造函数中获取其父级.在这种情况下,我们有技术限制,因为框架仍然没有父组件构造函数的返回值.这是与ES5(转化为)相比的回归.

javascript constructor class this ecmascript-6

6
推荐指数
1
解决办法
100
查看次数

接口和类型别名之间是否存在语义差异?

我可以用接口和类型别名做大部分相同的事情。

例如

类可以实现接口或类型别名

interface Shape {
    area(): number;
}

type Perimeter = {
    perimeter(): number;
}

class Rectangle implements Shape, Perimeter {
}
Run Code Online (Sandbox Code Playgroud)

它们可以组合起来创建新的接口/类型别名

interface A {
    a: string;
}

type B = {
    b: string
}

interface C extends B {
    c: string;
}

type D = A & {
    d: string;
}
Run Code Online (Sandbox Code Playgroud)

接口和类型注释之间是否存在语义差异?

typescript

6
推荐指数
1
解决办法
755
查看次数

ES6模块:TypeScript内部模块和软件包的可持续性

TypeScript中的类的全名

TypeScript 1.X允许开发人员使用内部模块作为命名空间.

module MyProject.MySubProject {
    export class A {
    }
    export function f() {
        var a1 = new A(); // valid
        var a2 = new MySubProject.A(); // valid too
        var a3 = new MyProject.MySubProject.A(); // valid too, again
    }
}
MyProject.MySubProject.f();
var a4 = new MyProject.MySubProject.A(); // ... and valid
Run Code Online (Sandbox Code Playgroud)

当transpiled到ES5,该代码创建对象MyProject,其中包含一个对象MySubProject,它包含两个功能Af.

从模块内部,可以使用相对名称(A,MySubProject.A)或全名(MyProject.MySubProject.A)设计类.从模块外部,导出的类与全名一起使用.

ES6中不再存在嵌套模块.TypeScript 将与ES6模块对齐.

classes(MyModule1.MyModule2.MyClass)的全名是否与ES6兼容?

如果我们想以旧方式使用命名空间,我们可以在闭包或对象中声明ES6类吗?

捆绑包和ES6模块

以下是ES6方式中的类似代码:

//------ MyProject/MySubProject.js …
Run Code Online (Sandbox Code Playgroud)

module typescript ecmascript-6

5
推荐指数
1
解决办法
641
查看次数

将 ImageData 对象(不是画布)转换为图像 dataURL

我想从 ImageData 对象(即宽度、高度、数据)创建 dataURL。我意识到画布有这个,但我想避免扭曲画布使用(主要是alpha预乘)..即我想避免明显的canvas.putImageData步骤。

这篇文章中,我可以将任何 arraybuffer/typedarray/dataview 转换为 base64。我知道画布 dataurl 如何将宽度/高度添加到 base64 字符串的 Uint8 数据部分。我也不知道 png 转换是如何完成的。(我可以接受原始数据图像类型,但我认为没有一个..只有 png 和 jpg)

可能的方法:

  • 使用 putImageData 将 ImageData 加载到 Canvas 中。失败,扭曲数据。
  • 使用 img.src = base64 数据创建图像。失败,必须是画布 dataurl。
  • 其他?

有人知道如何从原始宽度、高度、数据 Imagedata 构造图像 dataURL 吗?

javascript base64 data-uri html5-canvas

5
推荐指数
1
解决办法
4286
查看次数