4

考虑到它不支持具有不同原型的多个构造函数,我正在努力在 TypeScript 中实现一些类设计。基本上,我想设计一个带有一些参数的公共构造函数和一个“内部”构造函数(仅在库中使用)的类。公共构造函数将调用内部构造函数。在 C# 中,它看起来像这样:

public class Class1
{
    internal Class1(int id)
    { 
    }

    public Class1(string s)
        : this(s.Length)
    {
    }
}

知道如何将其翻译成 TypeScript 吗?

提前致谢!

4

3 回答 3

4

这也有效,并且可能更接近原版:

class Class1 {

    id:number;

    constructor(s: string) {
        (n:number) => {
            this.id = n;
        }(s.length)
    }
}

var t:Class1 = new Class1("HELLO");
console.log("Class1ID: " + t.id); // Output = Class1 ID: 5

作为参考,这里是输出 JS:

var Class1 = (function () {
    function Class1(s) {
        var _this = this;
        (function (n) {
            _this.id = n;
        })(s.length);
    }
    return Class1;
})();
var t = new Class1("HELLO");
console.log("Class1 ID: " + t.id);

更新

如果您必须能够仅使用 ID 调用构造函数,那么我认为您将不得不使用工厂方法,正如 Steve 所建议的那样。而且,由于我不认为 TS 构造函数可以是私有的,如果您需要该方法是私有的,您将不得不完全放弃构造函数并使用一对工厂方法。第一个实例可能如下所示:

class Class1 {

    constructor(public id:number) {} // Public, unfortunately.

    static Fabricate(s:string):Class1 {
        return new Class1(s.length);
    }
}

var classA:Class1 = new Class1(1);
var classB:Class1 = Class1.Fabricate("Hello");

console.log(classA.id);   // "1"
console.log(classB.id);   // "5"

第二个是这样的:

class Class1 {

    id:number;

    private static fabricate(n:number):Class1 {
        var class1:Class1 = new Class1();
        class1.id = n;
        return class1;
    }

    static Fabricate(s:string):Class1 {
        return fabricate(s.length);
    }
}

var classA:Class1 = Class1.Fabricate("Hello");

console.log(classA.id);   // "5"
于 2012-12-10T13:34:26.110 回答
2

我的第一个想法是使用重载,但这并不能处理您对数字构造函数的保护,这也意味着在构造函数中添加一个条件来确定您传递了哪个参数:

class MyClass {
    constructor(s: number);
    constructor(s: string);
    constructor(s: any) {

    }
}

所以务实的解决方案是拥有一个私有函数:

class MyClass {
    constructor(s: string) {
        this.initialize(s.length);
    }

    private initialize(id: number) {

    }
}
于 2012-12-10T09:25:40.603 回答
0

在 TypeScript 1.4 中,Union 类型现在可用于允许函数类型重载。请参阅TypeScript 博客文章中的描述。这应该允许您使用一个构造函数来拥有多个构造函数输入类型。

联合类型

JavaScript 函数可能采用许多可能的参数类型。到目前为止,我们已经使用函数重载来支持这一点。从 TypeScript 1.4 开始,我们已经推广了此功能,现在允许您使用联合类型指定该值是多种不同类型之一:

function f(x: number | number[]) {
  if (typeof x === "number") {
    return x + 10;
  }
  else {
    // return sum of numbers
  }
}

一旦有了联合类型的值,就可以使用 typeof 和 instanceof 检查以类型安全的方式使用该值。您会注意到我们在上面的示例中使用了它,并且可以将 x 视为 if 块内的数字类型。

联合类型是一种新的类型,可以在您指定类型的任何地方使用。

于 2015-04-13T13:16:39.373 回答