Mat*_*rný 11 generics types typescript
我写了一个小函数,以便更好地处理类型.
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);
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用泛型,但不知道如何从泛型参数获取类型.这是可能的?
Min*_*uel 13
您无法消除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');
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
请注意,不再有空情况,因为不可能知道未知string
类型是否实际上可能包含像'number'
在编译时一样的有效值。
这对大多数人来说已经足够了。
然而...
请注意,上面的 secretType 联合不起作用。如果出于某种原因,您真的真的希望它起作用,则可以改用条件类型:
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');
}
Run Code Online (Sandbox Code Playgroud)
const mysteryType = 'number' as 'boolean' | 'number';
const myMystery = evaluate('91823', mysteryType); // myMystery: number | boolean
Run Code Online (Sandbox Code Playgroud)
T
来自MyClass<T>
,这是可能的:class MyClass<T> {}
type GetMyClassT<C extends MyClass<any>> = C extends MyClass<infer T> ? T : unknown;
Run Code Online (Sandbox Code Playgroud)
const myInstance = new MyClass<"hello">();
let x: GetMyClassT<typeof myInstance>; // x: "hello"
Run Code Online (Sandbox Code Playgroud)
Jef*_*ski 12
typeof
是一个JavaScript运算符.它可以在运行时使用以获取JavaScript知道的类型.泛型是一种TypeScript概念,可帮助检查代码的正确性,但在编译输出中不存在.所以简短的回答是否定的,这是不可能的.
但你可以这样做:
class Holder<T> {
value: T;
constructor(value: T) {
this.value = value;
}
typeof(): string {
return typeof this.value;
}
}
Run Code Online (Sandbox Code Playgroud)
试一试.
这是有效的,因为我在Holder内部运行,而不是在Holder本身.
归档时间: |
|
查看次数: |
19111 次 |
最近记录: |