- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
鉴于类是从非类扩展而来的(包括但不限于函数),
function Fn() {}
class Class extends Fn {
constructor() {
super();
}
}
后果是什么?规范对此有何规定?
看起来 Babel、Google V8 和 Mozilla Spidermonkey 的当前实现都可以,而 TypeScript 会抛出
Type '() => void' is not a constructor function type
如果这是一个有效的 ES2015 代码,在 TypeScript 中处理它的正确方法是什么?
最佳答案
到目前为止,spec说extends
子句后面必须跟一个 TypeReference。还有一个TypeReference必须采用 A.B.C<TypeArgument>
的形式, 比如 MyModule.MyContainer<MyItem>
.因此,从语法上讲,您的代码是正确的。但这不是打字大小写。
规范说 BaseClass
必须是有效的 typescript 类。然而,规范已过时,如前所述 here .现在 TypeScript 允许在 extends 子句中使用表达式,只要表达式被计算为构造函数即可。这个定义是基于实现的。可以看看here .简单地说,如果一个表达式实现了new() {}
,它就可以算作构造函数。界面。
因此,您的问题是普通函数在 TypeScript 中未被识别为构造函数,这是有争议的,因为 ES2015 规范仅要求对象具有 [[construct]]
。内部方法。而用户定义的函数对象确实有它。
ES2015需要 BaseClass
is a constructor在运行时。一个对象 isConstructor
如果它有 [[construct]]
internal methd .规范说 [[construct]]
是 Function Object 的内部方法.用户函数是 Function Objects
的实例,所以它们自然是构造函数。但是builtin function和 arrow function可以没有[[construct]]
.
例如,下面的代码会在运行时抛出TypeError
因为parseInt
是内置函数,没有 [[construct]]
new parseInt()
// TypeError: parseInt is not a constructor
来自 ECMAScript
Arrow functions are like built-in functions in that both lack .prototype and any [[Construct]] internal method. So new (() => {}) throws a TypeError but otherwise arrows are like functions:
根据经验,任何没有 prototype
的函数不是 new
-能够。
简而言之,并非每个函数都是构造函数,TypeScript 通过要求 new() {}
来捕获这一点.但是,用户定义的函数是构造函数。
要解决这个问题,最简单的方法是声明 Fn
作为一个变量,并将其转换为构造函数。
interface FnType {}
var Fn: {new(): FnType} = (function() {}) as any
class B extends Fn {}
DISCALIMER:我不是 TypeScript 核心贡献者,只是一个 TS 粉丝,有几个与 TS 相关的副项目。所以这部分是我个人的猜测。
TypeScript 是一个起源于 2012 的项目,当 ES2015 还在昏暗的黑暗中若隐若现的时候。 TypeScript 没有很好的类语义引用。
那时,main goal TypeScript 的主要目的是保持与 ES3/5 的兼容。所以,new
调用函数在 TypeScript 中是合法的,因为它在 ES3/5 中也是合法的。同时,TypeScript 也旨在捕获编程错误。 extends
一个函数可能是一个错误,因为该函数可能不是一个合理的构造函数(比如,一个仅用于副作用的函数)。 extends
在 ES3/5 中甚至不存在!所以 TypeScript 可以自由定义自己对 extends
的用法, 制作 extends
必须与 class
配对多变的。这使得 TypeScript 更 TypeSafe,同时与 JavaScript 兼容。
现在,ES2015 规范已经定稿。 JavaScript 也有一个 extends
关键词!然后不兼容来了。有efforts解决不兼容问题。然而,问题仍然存在。 () => void
或 Function
由于内置函数,类型不应扩展,如上所述。以下代码将中断
var a: (x: string) => void = eval
new a('booom')
另一方面,如果 ConstructorInterface
被引入 TypeScript 并且每个函数文字都实现了它,然后就会出现向后不兼容。以下代码现在可以编译,但不会在 ConstructorInterface
时编译被介绍
var a = function (s) {}
a = parseInt // compile error because parseInt is not assignable to constructor
当然,TS 团队可以有一个平衡这两个选项的解决方案。但这不是一个高优先级。此外,如果 salsa,TS 支持的 JavaScript 的代号,已完全实现。这个问题自然就解决了。
关于javascript - 从非类继承 ES6/TS 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576731/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!