Javascript 如何为属性随实例化而变化的类创建TypeScript定义文件

Javascript 如何为属性随实例化而变化的类创建TypeScript定义文件,javascript,typescript,definitelytyped,Javascript,Typescript,Definitelytyped,我试图为一个JS类实现一个definitelyTypedTS定义文件,该类根据实例化的方式具有不同的定义。定义定义良好,实例化后不会更改。 例如: var a=newmyclass(“foo”); 控制台日志(a.a)//“a” 控制台日志(a.b)//“b” 控制台日志(交流)//“c” 控制台日志(a.d)//“未定义” 控制台日志(a.e)//“未定义” 控制台日志(a.f)//“未定义” var b=新的MyClass(“bar”); 控制台日志(b.a)//“未定义” 控制台日志(b.

我试图为一个JS类实现一个definitelyTypedTS定义文件,该类根据实例化的方式具有不同的定义。定义定义良好,实例化后不会更改。
例如:

var a=newmyclass(“foo”);
控制台日志(a.a)//“a”
控制台日志(a.b)//“b”
控制台日志(交流)//“c”
控制台日志(a.d)//“未定义”
控制台日志(a.e)//“未定义”
控制台日志(a.f)//“未定义”
var b=新的MyClass(“bar”);
控制台日志(b.a)//“未定义”
控制台日志(b.b)//“未定义”
控制台日志(b.c)//“c”
控制台日志(b.d)//“d”
控制台日志(b.e)//“e”
控制台日志(b.f)//“f”
我想要一个TS定义,比如:

接口myInterface{
c:字符串;
}
类MyClass(“foo”)实现myInterface{
a:弦;
b:弦;
c:字符串;
}
类MyClass(“bar”)实现myInterface{
c:字符串;
d:弦;
e:字符串;
f:字符串;
}
如有任何提示,将不胜感激
编辑:澄清:我无法修改
MyClass

此外,实例化MyClass的方法也有很多种,但它们都是众所周知的,并且是提前定义的。我们还可以假设,我们不必担心
MyClass
的非存在变体的情况

此外,
MyClass
最好描述为允许访问数据库的工厂;因此,
newmyclass(“foo”)
将创建一个对象,允许访问数据库中的foo表,其中字段名现在是所创建的
MyClass
对象的属性,如果您可以控制代码…

你应该考虑修理它。您描述的是两种不同的类型,让类根据输入参数更改其类型没有多大意义

示例中的
MyClass
看起来像某种奇怪的工厂,它使用构造函数而不是方法来创建对象

使用联合类型和类型保护,代码中的解决方案可能看起来像这样:

class Foo {
    public FooMember: string = "I'm foo";
}

class Bar {
    public BarMember:string = "I'm bar";
}

let myObj: Foo | Bar;

myObj = new Foo(); // or FooBarFactory.GetInstance("Foo") or whatever

if(myObj instanceof Foo){
    console.log(myObj.FooMember);
} else {
    console.log(myObj.BarMember);
}
如果您无法控制代码…


…您基本上是运气不佳,因为根据构造函数的输入,键入的类型不同。您不能键入类的构造函数以返回除类类型以外的任何内容。

如果它们不同,为什么是同一个类?为什么不创建两个不同的类呢?语法
类MyClass(“foo”)实现了myInterface{
是不正确的。您正在查找问号(
),如
d?:string;
。您的类是否仅用“foo”和“bar”实例化?如果有人路过“car”怎么办?@torazaburo我认为OP正在寻找一种方法,根据实例化显式更改类的类型,而不仅仅是让所有成员都可选。