首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在typescript中通过类型安全增强“this”

如何在typescript中通过类型安全增强“this”
EN

Stack Overflow用户
提问于 2021-02-25 00:10:20
回答 1查看 32关注 0票数 1

这段代码在vanilla javascript中运行良好。

代码语言:javascript
复制
const enhancementA = {
    a() {
        return this.c + 1;
    },
};

const enhancementB = {
    b() {
        return this.c + 2;
    },
};

class C {
    c = 0;
    constructor() {
        Object.assign(this, enhancementA, enhancementB);
    }
}

const d = new C();

d.a() // 1
d.b() // 2
d.c // 0

但它在typescript中不起作用

代码语言:javascript
复制
d.a() // TS2339: Property 'a' does not exist on type 'C'.
d.b() // TS2339: Property 'b' does not exist on type 'C'.

我如何让它在typescript中工作?

EN

回答 1

Stack Overflow用户

发布于 2021-02-25 00:16:31

我不认为C类可以保持原样,因为动态添加了enhancementAenhancementB,它们不存在于C中,因此不能从构造函数返回(或者突变为支持类型的实例)。我会创建一个函数,返回一个结合了增强功能的对象。

类型参数可用于指示this必须是具有数字c属性的对象。

代码语言:javascript
复制
const enhancementA = {
    a<T extends { c: number }>(this: T) {
        return this.c + 1;
    },
};

const enhancementB = {
    b<T extends { c: number }>(this: T) {
        return this.c + 2;
    },
};

const makeC = () => {
    return {
        c: 0,
        ...enhancementA,
        ...enhancementB
    };
};

const d = makeC();

d.a() // 1
d.b() // 2
d.c // 0

这将生成一个类型为

代码语言:javascript
复制
{
    b<T extends { c: number; }>(this: T): number;
    a<T extends { c: number; }>(this: T): number;
    c: number;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66354580

复制
相关文章

相似问题

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