【问题标题】:How to create Typescript Type Definition for same named methods如何为同名方法创建 Typescript 类型定义
【发布时间】:2016-07-23 00:31:53
【问题描述】:

我在 Typescript 中有以下定义

**sample.d.ts**

declare namespace Sample {

    class Widget {
        name(): string;  // gets the name
        name(name: string): void;    // sets the name
    } 
}

当我创建以下派生类型时,我没有收到任何警告:

export class BarWidget extends Sample.Widget {

    public name(): string {
        return '';
    }
}

但是,当我创建以下类型时,我收到了 Typescript 错误:

export class FooWidget extends Sample.Widget {

    public name(name: string): void {

    }
}

错误信息是:

类“FooWidget”错误地扩展了基类“Widget”。种类 属性“名称”不兼容。类型 '(name: string) => void' 是 不可分配给类型 '{ (): string; (名称: 字符串): void;}'

更新:

这个问题与对 kendo.ui 等库的支持有关:

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/kendo-ui/kendo-ui.d.ts#L3373

在该代码文件中,需要使用以下语法设置和获取 DropDownList 的 value 属性:

let foo = dd.value();
dd.value('new value');

我的最终解决方案是将 kendo.ui.d.ts 中的定义更改为:

declare namespace Sample {
    class Widget {
        name(name?: string):string
    } 
}

【问题讨论】:

    标签: typescript kendo-ui


    【解决方案1】:

    TypeScript 不能像其他类型语言(例如 Java)那样做所有相同的重载。见this question

    为了重载这个,你必须使用 TypeScript 奇怪的多功能定义,在我链接到的问题中有更详细的描述。

    declare namespace Sample {
    
        class Widget {
            name():string;
            name(name:string):void;
        }
    
    }
    
    export class BarWidget extends Sample.Widget {
    
        private _name:string;
    
        name():string;
        name(name:string):void;
        name(name?:string):string {
            if(name) {
                this._name = name;
            } else {
                return undefined;
            }
        }
    
    }
    

    【讨论】:

    • 在环境命名空间之外工作。使用修改后的示例会给出错误消息:“无法在环境上下文中声明访问器”
    • 再次感谢您的帮助。这会起作用,但它在技术上不符合要求,因为它将名称的基础定义从方法更改为属性。为此,我在 Typescript 存储库中添加了一个问题:github.com/Microsoft/TypeScript/issues/9907
    • 在此处参考我的最终 cmets 以获得更多上下文:github.com/Microsoft/TypeScript/issues/9907
    • 好的,我做了更多的研究,想出了一个适合你的解决方案。
    • 一个 void 函数返回未定义。您可以从返回类型为字符串的函数返回 undefined,就像返回 null 一样。
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多