在TypeScript中,如何定义提供从成员对象返回的值的方法类型? 接口Foo{ getValue():T; } 类Foo1实现了Foo{ __值:字符串; 构造函数(值:字符串){ 此值为.\uuuu值=值; } getValue():字符串{ 返回此值; } } 类Foo2实现了Foo{ __值:数字; 构造函数(值:number){ 此值为.\uuuu值=值; } getValue():数字{ 返回此值; } } 分类栏{ 私人(u_foo:T),; 构造函数(foo:T){ 这个; } getValueOfFoo(){ 返回此值。_ufoo.getValue(); } } const bar1=新条(new Foo1('hello')); const val1:string=bar1.getValueOfFoo(); 常量条2=新条(新条2(12345)); const val2:number=bar2.getValueOfFoo();

在TypeScript中,如何定义提供从成员对象返回的值的方法类型? 接口Foo{ getValue():T; } 类Foo1实现了Foo{ __值:字符串; 构造函数(值:字符串){ 此值为.\uuuu值=值; } getValue():字符串{ 返回此值; } } 类Foo2实现了Foo{ __值:数字; 构造函数(值:number){ 此值为.\uuuu值=值; } getValue():数字{ 返回此值; } } 分类栏{ 私人(u_foo:T),; 构造函数(foo:T){ 这个; } getValueOfFoo(){ 返回此值。_ufoo.getValue(); } } const bar1=新条(new Foo1('hello')); const val1:string=bar1.getValueOfFoo(); 常量条2=新条(新条2(12345)); const val2:number=bar2.getValueOfFoo();,typescript,Typescript,我希望42和45行的返回值是string和number,但它们不是 如何定义可以返回正确类型的方法类型取决于通过构造函数提供的对象类型?我运行了以下代码(您的代码)并查看了正确的结果 const bar1 = new Bar(new Foo1('hello')); const val1: string = <string>bar1.getValueOfFoo(); console.log(typeof(val1)) const bar2 = new Bar(new Foo2(123

我希望42和45行的返回值是
string
number
,但它们不是


如何定义可以返回正确类型的方法类型取决于通过构造函数提供的对象类型?

我运行了以下代码(您的代码)并查看了正确的结果

const bar1 = new Bar(new Foo1('hello'));
const val1: string = <string>bar1.getValueOfFoo();
console.log(typeof(val1))

const bar2 = new Bar(new Foo2(12345));
const val2: number = <number>bar2.getValueOfFoo();
console.log(typeof(val2))

它当前未按预期工作的原因是,您的泛型约束被定义为
T extends Foo1 | Foo2
。Typescript不允许缩小泛型联合。看看这个问题

问题的要点是一位typescript维护者的评论:

TL;设计讨论中的DR:做“正确”的事情有点明显,但需要对我们如何处理类型参数进行大量修改,具有一致的负面性能影响,而不会对实际面向用户的行为产生相应的正面影响

如果新的模式出现,使这一问题更加频繁,我们可以再看一看

解决您手头问题的一个快速方法是避免这样的通用联合,不确定它是否适合您的实际用例:

class Bar<T> {
    private __foo: Foo<T>;

    constructor(foo: Foo<T>) {
        this.__foo = foo;
    }

    getValueOfFoo() {
        return this.__foo.getValue();
    }
}
类栏{
私人(foo):foo ;;
构造函数(foo:foo){
这个;
}
getValueOfFoo(){
返回此值。_ufoo.getValue();
}
}

要删除警告,请对收到的值进行类型转换。已更新我的asnwer。仍然没有回答OP提出的明确问题:
如何定义可返回正确类型的方法类型取决于通过构造函数提供的对象类型?
class Bar<T> {
    private __foo: Foo<T>;

    constructor(foo: Foo<T>) {
        this.__foo = foo;
    }

    getValueOfFoo() {
        return this.__foo.getValue();
    }
}