首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6混合语言的类型记录定义

ES6混合语言的类型记录定义
EN

Stack Overflow用户
提问于 2016-09-10 20:46:50
回答 1查看 613关注 0票数 5

有办法为ES6混合编写类型文本定义吗?

我在library.js中有这个模式,我想创建library.d.ts

代码语言:javascript
复制
// declaration in `library.js`
class Super extends Simple {
    constructor() {}

    static Compose(Base = Super) {
        return class extends Base {
            // ...    
        }

    }
}

// usage in `client.js`
class MyClass extends Super.Compose() {}
let myInstance = new MyClass();

class MyOtherClass extends Super.Compose(AnotherClass) {}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-11 06:51:14

不,类型类型系统没有足够的表达能力--参见https://github.com/Microsoft/TypeScript/issues/7225https://github.com/Microsoft/TypeScript/issues/4890中的讨论。

打字本中的习语“类”写成

代码语言:javascript
复制
interface Constructor<T> {
    new (...args): T;
}

因此,撰写声明的一种方法是

代码语言:javascript
复制
export declare class Simple {}

export declare class Super extends Simple {
    static Compose<T>(Base?: Constructor<T>): Constructor<T & {/*mixed-in declarations*/}>
}

也就是说,复合返回类型被声明为交集类型的构造函数--这种类型必须具有参数(Base)的所有属性以及mixin的所有属性。

您可以像这样使用这个声明(假设它在library.d.ts文件中)

代码语言:javascript
复制
import {Super} from './library'

let MyComposed = Super.Compose(Super)
let myInstance = new MyComposed

不方便之处在于,您总是必须为Super.Compose()提供参数,因为类型推断在不知道默认参数的值的情况下无法工作,并且不能在声明文件中为默认参数提供值。

但最大的问题是你不能把作文的结果作为一个类来使用:

代码语言:javascript
复制
class MyClass extends Super.Compose(Super) {}

由于上述问题而不进行汇编:

代码语言:javascript
复制
error TS2509: Base constructor return type 'Super & {}' is not a class or interface type.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39430443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档