鉴于类是从非类扩展而来的(包括但不限于函数),
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/
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass
我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
假设我有一个名为Flight的模块,其中包含类方法和实例方法。我可以使用include、extend或两者将其方法放入类中:classBatinclude会将Flight添加到Bat.ancestors,但extend不会。我的问题是,为什么模块与类不同?当我对Mammal进行子类化时,我总是同时获得类和实例方法。然而,当我混入一个模块时,我不能同时获得类和实例方法(除非我使用self.included钩子(Hook)或类似ActiveSupport::Concern的东西)。这种差异背后是否存在语言设计问题? 最佳答案 Modul
在Ruby(1.8.X)中为什么Object既继承了内核又包含了内核?仅仅继承还不够吗?irb(main):006:0>Object.ancestors=>[Object,Kernel]irb(main):005:0>Object.included_modules=>[Kernel]irb(main):011:0>Object.superclass=>nil请注意,在Ruby1.9中情况类似(但更简洁):irb(main):001:0>Object.ancestors=>[Object,Kernel,BasicObject]irb(main):002:0>Object.included
我正在为Rails创建我的第一个插件。我对ruby还是很陌生,我想知道是否有可能获得继承类?例如,我正在尝试创建一个插件,在您不使用迁移时允许进行单元测试和功能测试。我要做的是初始化一个名为controller的类变量,以初始化为正在测试的Controller类型。如果我有一个基类ControllerTest:classControllerTest所以我目前坚持的是获取继承类的名称。这可能吗?如果没有,有没有人知道我可以如何着手实现它的另一种方式?提前致谢。 最佳答案 非常简单:使用“继承”回调。来自Class类的RDoc:in