我new()在这里的官方文档中遇到了关于泛型的问题.
这是代码上下文:
function create<T>(c: { new(): T; } ): T {
return new c();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码被转换为以下JavaScript代码:
function create(c) {
return new c();
}
Run Code Online (Sandbox Code Playgroud)
new()是JavaScript中的非法语法.TypeScript是什么意思?
此外,什么{new(): T; }意思?我知道它必须是一种类型,但如何?
我正在尝试发现一种将多个接口组合成一个抽象类的模式.目前我可以通过"implements"组合多个接口,但接口不能声明构造函数.当我必须引入一个构造函数时,我被迫使用一个抽象类.当我使用抽象类时,我必须重新声明整个复合接口!当然我错过了什么?
interface ILayerInfo {
a: string;
}
interface ILayerStatic {
b(): string;
}
class Layer implements ILayerInfo, ILayerStatic {
constructor(info: ILayerInfo);
a: string;
b(): string;
}
Run Code Online (Sandbox Code Playgroud)
答案:使用'new':
interface Layer extends ILayerInfo, ILayerStatic {
new(info: ILayerInfo);
}
// usage: new Layer({ a: "" });
Run Code Online (Sandbox Code Playgroud) 我从正在使用的库中收到以下界面:
export interface LatLng {
constructor(lat: number, lng: number): void;
lat(): number;
lng(): number;
}
Run Code Online (Sandbox Code Playgroud)
如何创建此类的实现?(我需要一个测试模型)一个自然的实现,其构造函数定义为:
export class LatLngImpl implements LatLng {
constructor(private _lat: number, private _lng: number) { }
Run Code Online (Sandbox Code Playgroud)
无法编译:
类“ LatLngImpl”错误地实现了接口“ LatLng”。属性“构造函数”的类型不兼容。类型“功能”不能分配给类型“(纬度:数字,lng:数字)=>>无效”。类型'Function'不提供签名'(lat:number,lng:> number):void'的匹配项
我读过有关打字稿中的构造函数接口的信息,但我认为它不适用于此处。
编辑:
我不需要理解的是constructor()接口中的此声明。具有构造函数签名的接口使用new ()语法。
我一直在使用TypeScript中的构造签名接口,当下面的键入检查失败时,我变得有点困惑:
class Foo {
constructor () {
}
}
interface Bar {
new(): Bar;
}
function Baz(C : Bar) {
return new C()
}
var o = Baz(Foo);
Run Code Online (Sandbox Code Playgroud)
类型错误是:
提供的参数与调用目标的任何签名都不匹配:构造类型'new()=> Foo'和'Bar'的签名不兼容:类型'Bar'需要构造签名,但Type'Foo'缺少一个(C:Bar) )=>吧
Foo的构造函数的类型是()=> Foo,这就是我认为Bar所说的.我在这里错过了什么吗?
在设计定义文件时,我遇到了这个错误(TS2507).
如何将类型指定为"构造函数类型"?
在这种情况下,我遇到了“编译”问题:
interface IDataObjectConstructor {
new (objJSON?: any): myDataObject;
}
class myDataObject implements IDataObjectConstructor {
constructor(objJSON: any = null) {
for (var prop in objJSON) {
this[prop] = objJSON[prop];
}
}
}
Run Code Online (Sandbox Code Playgroud)
它说:
类“ myDataObject”错误地实现了接口“ IDataObjectConstructor”。
类型'myDataObject'不提供签名'new(objJSON ?: any):myDataObject'的匹配项
最后,我想像这样使用此对象:
class viewModelList<T extends myDataObject>{
item: T;
constructor(itemType: T) { this.item = itemType; }
itemBuilder(json?) { return new this.item(json); }
}
class derivedDataObject extends myDataObject{
constructor(objJSON: any = null) { super(objJSON); }
}
class derivedViewModelList extends viewModelList<derivedDataObject>{
constructor() { super(derivedDataObject); }
} …Run Code Online (Sandbox Code Playgroud) 我有以下定义类型文件:
// index.d.ts
declare module 'Transformer' {
class EditableElement {
constructor(target: SVGPoint);
}
export = EditableElement;
}
Run Code Online (Sandbox Code Playgroud)
我想导入EditableElement.但是当我写下面这一行时:
import {EditableElement} from 'Transformer';
Run Code Online (Sandbox Code Playgroud)
我收到下一个错误:
模块"Transformer"解析为非模块实体,无法使用此构造导入.
我怎么能导入这个EditableElement课程?实际上,我只是想利用那个班级.我不希望该import指令在我的代码中具有附带效果.我只是想用它:'(
typeFilter : new(...args) => T
Run Code Online (Sandbox Code Playgroud)
where T是函数的泛型参数.
new(...args)在这种情况下意味着什么,它在哪里记录?
例如,以下不会编译(链接到打字稿游乐场示例):
declare class ClassFactory {
constructor();
new(): any;
}
const User = new ClassFactory();
const user = new User();
Run Code Online (Sandbox Code Playgroud)
结果错误:
Cannot use 'new' with an expression whose type lacks a call or construct signature.
Run Code Online (Sandbox Code Playgroud)
我需要额外的注释吗?我如何声明一个元类?我假设它new(): any;被视为类上的原型方法,因此是实例构造模式。
编辑:固定链接
我正在用 TypeScript 2.6 编写一些图形代码,但在继承和通用代码方面我有一个小障碍:
abstract class Series { /**/ }
class LineSeries extends Series { /**/ }
class BarSeries extends Series { /**/ }
class ScatterSeries extends Series { /**/ }
class Chart {
private seriesArray: Series[] = [];
constructor(series: Series[]) {
let seriesType: typeof Series = null;
switch (series.SeriesType) {
case SeriesType.LineSeries:
seriesType = LineSeries;
break;
case SeriesType.BarSeries:
seriesType = BarSeries;
break;
case SeriesType.ScatterSeries:
seriesType = ScatterSeries;
break;
default:
throw "Unsupported series type";
}
for (let i = 0; …Run Code Online (Sandbox Code Playgroud)