Javascript 基于参数值类型的返回类型

Javascript 基于参数值类型的返回类型,javascript,typescript,types,Javascript,Typescript,Types,我正在创建一个函数,该函数接受两个参数,一个是键,另一个是将结果转换为的值。因此,我创建了一个类型,该类型限制了项可以强制转换的值。我也希望它是返回类型,但是基于EnvCast,它的前缀是typeof,因此我使用它的方式是,它说它应该返回typeof x 如何基于cast的值返回类型?因此,如果cast('my_key',Number)返回类型将是Number,而不是type of Number declare type EnvCast=typeof Number | typeof Boolea

我正在创建一个函数,该函数接受两个参数,一个是
,另一个是
将结果转换为
的值。因此,我创建了一个
类型
,该类型限制了项可以强制转换的值。我也希望它是返回类型,但是基于
EnvCast
,它的前缀是
typeof
,因此我使用它的方式是,它说它应该返回
typeof x

如何基于
cast
的值返回类型?因此,如果
cast('my_key',Number)
返回类型将是
Number
,而不是
type of Number

declare type EnvCast=typeof Number | typeof Boolean | typeof String;
导出函数env(键:string,cast?:EnvCast):T{
const result=(process.env[key]?process.env[key]:“”)作为字符串;
if(!cast){返回结果;}
回投(结果);
}
编辑:

我想我可以做这样的事情(没有这个有办法吗)?:

使用函数怎么样

function env<T>(key: string, cast: T): T {

}
函数env(键:字符串,强制转换:T):T{
}
用法如下

const x = env<number>('' , 10); // x will be of type number
const x=env(“”,10);//x将是类型编号

有些不同的方法,如果我理解您的要求,这可能会奏效:

declare type EnvCast = Number | Boolean | String;
export function env<T extends EnvCast>(key: string, cast?: (string)=>T):T {
    const result = (process.env[key] ? process.env[key] : '') as string;
    return cast(result);
}
const x= env('42',Number)  //x is number here
declare type EnvCast=Number | Boolean | String;
导出函数env(键:string,cast?:(string)=>T):T{
const result=(process.env[key]?process.env[key]:“”)作为字符串;
回投(结果);
}
const x=env('42',Number)//x是这里的数字

参数类型可以由扩展
EnvCast
的类型参数
C
表示。然后,
env
函数返回,基本上是
number | boolean | string
InstanceType
将为我们提供基本的装箱类型,即:

导出函数env(键:string,cast?:C):ReturnType{ const result=(process.env[key]?process.env[key]:“”)作为字符串; 如果(!cast){throw new Error()/*或您想在此处执行的其他操作*/} 返回类型为ReturnType的强制转换(结果); } 常数r1=env(“myKey”,Number)//Number 常量r2=env(“myKey”,布尔)//布尔值 const r3=env(“myKey”,String)//String const r4=env(“myKey”,数组)//错误 const r5=env(“myKey”,Date)//错误

你的意思是做
Number | Boolean | String
。我对Typescript还是新手,因为
typeof Number==“Number”
等等。。。除非您打算让
env
返回字符串?否,使用该语法意味着值将是
123
,并且我不需要物理数字,我需要函数类型
number
,以便我可以在我的函数中调用该函数。您可以将env函数的返回类型声明为:ReturnType。。这可能更接近您需要的,但仍然缺少,因为返回类型将是String | Number | Boolean。不确定ts编译器是否足够聪明来解决这个问题,但它是一个有趣的用例,将监视这个问题:)您希望typescript做什么?跟踪此函数之后的类型?或者只是不显示错误?@OdedBD我想获取返回类型,以便在返回后将变量设置为该类型。
declare type EnvCast = Number | Boolean | String;
export function env<T extends EnvCast>(key: string, cast?: (string)=>T):T {
    const result = (process.env[key] ? process.env[key] : '') as string;
    return cast(result);
}
const x= env('42',Number)  //x is number here
export function env<C extends EnvCast>(key: string, cast?: C): ReturnType<C> {
  const result = (process.env[key] ? process.env[key] : '') as string;
  if (!cast) { throw new Error() /* or something else you want to do here */ }
  return cast(result) as ReturnType<C>;
}

const r1 = env("myKey", Number) // number
const r2 = env("myKey", Boolean) // boolean
const r3 = env("myKey", String) // string
const r4 = env("myKey", Array) // error
const r5 = env("myKey", Date) // error