我在两个单独的文件中有两个类,一个从另一个扩展.基类包含一些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) 我想确定哪种是等效解决方案之间的最佳实践.用例是监听事件的类的实例.Axel Rauschmayer博士更喜欢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中的实施代码阅读此答案.它效率不高.我坚持认为:我看到的所有基准测试在所有浏览器上都显示出类似的结果.
有没有办法在同一时间内使用低内存和良好的性能?
目前我正在开发一个打字稿项目,我真的很喜欢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上的一些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等等).
为什么不起作用?
我使用opencv的全景拼接算法,以便将2或3个图像拼接成一个新的结果图像.
我有每个源图像中的点坐标.我需要计算结果图像中这些点的新坐标.
我在下面描述算法.我的代码类似于opencv(分支3.4)中的"stitching_detailed"示例.产生了一种result_mask类型Mat,也许是解决方案?但我不知道如何使用它.我在这里找到了一个相关的问题,但没有找到缝合.
任何的想法?
找到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: …
这种用法非常简单:作为一个合约,函数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)
使用此代码:
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) 在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(转化为)相比的回归.
我可以用接口和类型别名做大部分相同的事情。
例如
类可以实现接口或类型别名
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 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,它包含两个功能A和f.
从模块内部,可以使用相对名称(A,MySubProject.A)或全名(MyProject.MySubProject.A)设计类.从模块外部,导出的类与全名一起使用.
但ES6中不再存在嵌套模块.TypeScript 将与ES6模块对齐.
classes(MyModule1.MyModule2.MyClass)的全名是否与ES6兼容?
如果我们想以旧方式使用命名空间,我们可以在闭包或对象中声明ES6类吗?
以下是ES6方式中的类似代码:
//------ MyProject/MySubProject.js …Run Code Online (Sandbox Code Playgroud) 我想从 ImageData 对象(即宽度、高度、数据)创建 dataURL。我意识到画布有这个,但我想避免扭曲画布使用(主要是alpha预乘)..即我想避免明显的canvas.putImageData步骤。
从这篇文章中,我可以将任何 arraybuffer/typedarray/dataview 转换为 base64。我不知道画布 dataurl 如何将宽度/高度添加到 base64 字符串的 Uint8 数据部分。我也不知道 png 转换是如何完成的。(我可以接受原始数据图像类型,但我认为没有一个..只有 png 和 jpg)
可能的方法:
有人知道如何从原始宽度、高度、数据 Imagedata 构造图像 dataURL 吗?
typescript ×6
javascript ×3
ecmascript-6 ×2
es6-modules ×2
base64 ×1
bind ×1
c++ ×1
class ×1
constructor ×1
data-uri ×1
html5-canvas ×1
interface ×1
jquery ×1
lambda ×1
module ×1
namespaces ×1
opencv ×1
readonly ×1
this ×1