gpt4 book ai didi

generics - 获取泛型参数的类型

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:38 24 4
gpt4 key购买 nike

我编写了小函数以更好地处理类型。

function evaluate(variable: any, type: string): any {
switch (type)
{
case 'string': return String(variable);
case 'number': return isNumber(variable) ? Number(variable) : -1;
case 'boolean': {
if (typeof variable === 'boolean')
return variable;

if (typeof variable === 'string')
return (<string>variable).toLowerCase() === 'true';

if (typeof variable === 'number')
return variable !== 0;

return false;
}
default: return null;
}
}

function isNumber(n: any): boolean {
return !isNaN(parseFloat(n)) && isFinite(n);
}

我尝试对泛型进行同样的尝试,但不知道如何从泛型参数中获取类型。可能吗?

最佳答案

您无法消除 type字符串,但您可以通过添加重载使您的函数在类型方面更加智能和可用:

function evaluate(variable: any, type: 'string'): string;
function evaluate(variable: any, type: 'number'): number;
function evaluate(variable: any, type: 'boolean'): boolean;
function evaluate(variable: any, type: string): unknown {
...
default: throw Error('unknown type');
}
const myBool = evaluate('TRUE', 'boolean'); // myBool: boolean
const myNumber = evaluate('91823', 'number'); // myBool: boolean
evaluate('91823', 'qwejrk' as any); // RUNTIME ERROR (violated types)

const mysteryType = 'number' as 'boolean' | 'number';
const myMystery = evaluate('91823', mysteryType); // COMPILER ERROR, no overload matches.

Playground Link

请注意,不再存在空值,因为无法知道未知的 string 是否为空值。 type 实际上可能包含有效值,例如 'number'在编译时。

这对大多数人来说已经足够好了。


但是...

请注意上面的 mysteryType 联合不起作用。如果出于某种原因你真的真的真的想要它工作,你可以改用条件类型:

function evaluate<T extends string>(variable: any, type: T):
T extends 'string' ? string :
T extends 'number' ? number :
T extends 'boolean' ? boolean :
never;
function evaluate(variable: any, type: string): unknown {
...
default: throw Error('unknown type');
}
const mysteryType = 'number' as 'boolean' | 'number';
const myMystery = evaluate('91823', mysteryType); // myMystery: number | boolean

Playground Link


此外,如果您用 Google 搜索了这个问题并且想知道如何获得 T来自 MyClass<T> ,这也是可能的:

class MyClass<T> {}

type GetMyClassT<C extends MyClass<any>> = C extends MyClass<infer T> ? T : unknown;
const myInstance = new MyClass<"hello">();
let x: GetMyClassT<typeof myInstance>; // x: "hello"

Playground Link

关于generics - 获取泛型参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18215899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com