您不能消除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.
游乐场链接
请注意,不再有 null 情况,因为无法知道未知string
类型是否实际上可能包含有效值,例如'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
游乐场链接
此外,如果您在 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"
游乐场链接