Typescript 强制函数 return 基于模板变量的类型
Typescript enforcing function return types based on template variable
在 Typescript 中,您可以重载函数以便根据输入参数具有不同的 return 类型:
function test2(b: true): {a: number};
function test2(b: false): {x: number};
function test2(b: boolean): {a: number} | {x: number} {
if(b) return {a: 1};
return {x: 1};
}
const a_t2: {a: number} = test2(true);
const x_t2: {x: number} = test2(false);
我正在寻找一种在函数本身内部隐式强制执行 return 类型的方法。如果您改为编写此函数体,Typescript 将不会抛出错误:
function test2(b: true): {a: number};
function test2(b: false): {x: number};
function test2(b: boolean): {a: number} | {x: number} {
// breaking the contract
if(b === false) return {a: 1};
return {x: 1};
}
我最接近可行的解决方案是这个例子,尽管它会抛出一些错误:
function test<B extends boolean>(b: B): B extends true ? {a: number} : {x: number} {
if(b) {
// Type '{ a: number; }' is not assignable to type 'B extends true ? { a: number; } : { x: number; }'.(2322)
return {a: 1};
} else {
// Type '{ x: number; }' is not assignable to type 'B extends true ? { a: number; } : { x: number; }'.(2322)
return {x: 2};
}
}
const a_t = test(true); // {a: number}
const x_t = test(false); // {b: number}
我可以通过将 return 值转换为:
来解决这个错误
if(b) {
return {a: 1} as B extends true ? {a: number} : never;
} else {
return {x: 2} as B extends true ? never : {x: number};
}
但它违背了隐式严格 return 值的目的。
有人知道更好的解决方案吗?
感谢评论,这里有一个类似的问题和答案
它很好地解释了为什么还不可能完成我在原始问题中提出的要求,并且有一个 Typescript Github 问题 here 关于这个确切的事情。
在 Typescript 中,您可以重载函数以便根据输入参数具有不同的 return 类型:
function test2(b: true): {a: number};
function test2(b: false): {x: number};
function test2(b: boolean): {a: number} | {x: number} {
if(b) return {a: 1};
return {x: 1};
}
const a_t2: {a: number} = test2(true);
const x_t2: {x: number} = test2(false);
我正在寻找一种在函数本身内部隐式强制执行 return 类型的方法。如果您改为编写此函数体,Typescript 将不会抛出错误:
function test2(b: true): {a: number};
function test2(b: false): {x: number};
function test2(b: boolean): {a: number} | {x: number} {
// breaking the contract
if(b === false) return {a: 1};
return {x: 1};
}
我最接近可行的解决方案是这个例子,尽管它会抛出一些错误:
function test<B extends boolean>(b: B): B extends true ? {a: number} : {x: number} {
if(b) {
// Type '{ a: number; }' is not assignable to type 'B extends true ? { a: number; } : { x: number; }'.(2322)
return {a: 1};
} else {
// Type '{ x: number; }' is not assignable to type 'B extends true ? { a: number; } : { x: number; }'.(2322)
return {x: 2};
}
}
const a_t = test(true); // {a: number}
const x_t = test(false); // {b: number}
我可以通过将 return 值转换为:
来解决这个错误 if(b) {
return {a: 1} as B extends true ? {a: number} : never;
} else {
return {x: 2} as B extends true ? never : {x: number};
}
但它违背了隐式严格 return 值的目的。
有人知道更好的解决方案吗?
感谢评论,这里有一个类似的问题和答案
它很好地解释了为什么还不可能完成我在原始问题中提出的要求,并且有一个 Typescript Github 问题 here 关于这个确切的事情。