【发布时间】:2022-11-04 23:19:13
【问题描述】:
我正在尝试使用其返回类型将取决于 boolean 值的方法创建一个类标志参数
我已经成功地做到了这一点
- 使用实现接口的普通函数表达式,
- 或在类中直接在类体中声明方法重载时
然而,当我尝试使用由该类实现的接口时,我无法做到这一点.
我想使用类方法的接口实现来实现动态返回类型。
谢谢!
这是Typescript Playground 中也提供的示例代码
// it works with interface for plain function
interface common {
<T extends boolean>(flag: T): T extends true ? string : boolean ;
(flag: boolean): string | boolean;
}
const method: common = (flag: boolean) => {
if (flag) {
return 'truhty';
} else {
return false ;
}
}
// it works with plain method overload
function test(flag: true): string
function test(flag: false): boolean
function test(flag: boolean): string | boolean {
if (flag) {
return 'truthy'
} else {
return false;
}
}
const x = test(true);
const y = test(false);
// This works with direct class method overload
class Exp {
test(flag: true): string
test(flag: false): boolean
test(flag: boolean): string | boolean {
if (flag) {
return 'truthy'
} else {
return false;
}
}
}
const val = new Exp().test(false); // boolean!
const val2 = new Exp().test(true); // string!
// It does not work in class with interface overload
interface common2 {
test(flag: true): string
test(flag: false): boolean
test(flag: boolean): string | boolean
}
class Exp2 implements common2 {
test(flag: boolean) {
if (flag) {
return 'truthy'
} else {
return false;
}
}
}
// it is not working in class with generic conditional type
interface common3 {
test<T extends boolean>(flag: T): T extends true ? string: boolean
test(flag: boolean): string | boolean
}
class Exp3 implements common3 {
test(flag: boolean) {
if (flag) {
return 'truthy';
} else {
return false;
}
}
}
const val3 = new Exp3().test(false); // WRONG false | 'truthy'!
const val4 = new Exp3().test(true); // WRONG false | 'truthy'!
// it does not work with conditional directly in class
class Exp4 {
test<T extends boolean>(flag: T): T extends true ? string : boolean
test(flag: boolean) {
if (flag) {
return 'truthy';
} else {
return false;
}
}
}
const val5 = new Exp3().test(false); // WRONG false | 'truthy'!
const val6 = new Exp3().test(true); // WRONG false | 'truthy'!
【问题讨论】:
标签: typescript class dynamic interface return-type