TypeScript 为类方法提供声明关键字支持

axzmvihb  于 7个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(54)

搜索词

声明,类,方法

建议

我知道 declare 关键字已经支持类属性。我在想是否可以将支持也扩展到类方法上?

用例

你重写了 a 方法,并且还有一些其他方法返回 a 的返回值。

示例

这只是一个简单的例子来描述我的想法。

class BaseTag
{
    constructor(tag: string) {...}

    static fromString(tag: string): BaseTag
    {
        return new BaseTag(tag);
    }

    static fromNumber(tag: number): BaseTag
    {
        return this.fromString(tag.toString());
    }
}

class ExtendedTag extends BaseTag
{
    static fromString(tag: string): ExtendedTag
    {
        return new BaseTag(`Tag: ${ tag}`);
    }

    declare static fromNumber(tag: number): ExtendedTag;

    // // Without `declare` support
    // static fromNumber(tag: number): ExtendedTag
    // {
    //     return super.fromString(tag) as unknown as ExtendedTag;
    // }
}

检查清单

我的建议满足以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性改变
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能,带有 JavaScript 输出的非 ECMAScript 语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
uz75evzq

uz75evzq2#

你所要求的是 #5863
@RyanCavanaugh 不,这是一个不同的想法。让我给你另一个例子:

class BaseClass
{
    declare private version: string;

    public toJSON(): BaseInterface
    {
        return {
            version: this.version,
        };
    }

    protected toObject(): ObjectMixin<BaseInterface>
    {
        return Object.assign(this.toJSON(), { hello: true });
    }
}

interface BaseInterface
{
    version: string;
}

class ExtendedClass extends BaseClass
{
    declare private count: number;

    public toJSON(): ExtendedInterface
    {
        return Object.assign(super.toJSON(), { count: this.count });
    }

    declare protected toObject(): ObjectMixin<ExtendedInterface>;

    // // Without `declare` support
    // protected toObject(): ObjectMixin<ExtendedInterface>
    // {
    //     return super.toObject() as unknown as ObjectMixin<ExtendedInterface>;
    // }
}

interface ExtendedInterface extends BaseInterface
{
    count: number;
}

type ObjectMixin<T> = T & { hello: boolean; };

TypeScript Playground
虽然这个例子似乎可以用泛型替换,但如果有多个返回类型需要替换怎么办?
我知道我可以使用一个与类名相同的接口来覆盖方法,但这只适用于公共成员,而不是受保护或私有的成员。
更重要的是,如果 declare 关键字已经支持类属性,为什么不也支持类方法呢?

zy1mlcev

zy1mlcev3#

我应该为这个写一个提案吗?

6kkfgxo0

6kkfgxo04#

declare protected toObject: () => ObjectMixin<ExtendedInterface>; 应该可以工作?

liwlm1x9

liwlm1x95#

declare protected toObject: () => ObjectMixin<ExtendedInterface>; 应该可以工作吧?
@whzx5byb 是的,这个应该可以。但我希望 declare 的方法也能支持。
抱歉回复晚了 😅

ma8fv8wu

ma8fv8wu6#

declare protected toObject: () => ObjectMixin<ExtendedInterface>; 应该可以工作吧?
@whzx5byb 嗯...这种方法有一个问题,你不能使用一个方法来覆盖一个属性,这意味着这个方法不起作用:

class SuperClass
{
    declare protected toObject: () => ObjectMixin<ExtendedInterface>;
}

class SubClass extends SuperClass
{
    protected toObject(): ObjectMixin<...>
    {
        ...
    }
}

相关问题