你无法消除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.
游乐场链接 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAUwG4EMA2J1WQCgwCcZ0AjTZALkXTAE8AaRKegB2sQHIBnKEsAHMuAShp8BggNwAoUJFgIUGbLgLFSFTnSYt2nLmBABbMsiKiaR0+dnzo8JGiw48hdCXKUaO5qw40XGRwcJR0lojBoch0duAOSs6qbhpe2gx++uL8MEJiiOAA1mBwAO5IAN4yiDWIPKUwUBAAFoj4-sgi1bVVtX2IEOg8yNwSucI0RMhQIERIAMo5Qu6eWiKy-bWDw9zWZhaT07NIMDwAcib7K5qUIogA-IgXNkTXaXc0ALQAjBubA0MRkEQmEwFwaL1-n0YMA2h04LDUlpEABeNGjJbCLpQqFTGZzRBIygAOigcAAMmVzABhQH4O5olHcfggZBcP44xB446IACEvKJyA5-QAvt1NgATZDAdAgTBQQ74pBGTCYYVisVyeKKE7nS7mfBgHwMfJRUGISE1bkE3mnM7oM74NgeYYAMUwcFwhpEdwAZL7EKdXblGgQwOsZJqIAg+IhjPQAEIg1HKFxqfBcAAqACUAKoAUS4zGB0XC60QAHoK3HEyCaGaYmAZNGwLH4899imkq4CFwAJzfAAcACYAMxF3b6izlqs1pOhesgxsybvp-tDscTrgAR1KyAAVkRClxaDxaCapJXq3mzpmAJIAWXziHz2ezAHls21UPBMGoJXoHA8F0zYxlANZ8OY9CZvoKaGFOJ5DNwDbhIgAA+k4vOyoGtuB8YPvQkFEPQXYqD2GYDiO47MPGRHQfoM7VtS74PgACne5Kvi+b6fswJSIHAqDmB66AAcYuAtMgPDEjIQA
请注意,不再存在空情况,因为不可能知道未知情况是否存在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
游乐场链接 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAUwG4EMA2J1WQHgBUUAPPMAEwGdEqoAnGMAcwD4AKDR9AI02QBcidGACeAGkRRRAB0GJCASgEAoROoWly1RAHI6jFrsQB+WgybNEqjZuRlklGrrAgAtj2T1jZ1x6-WahrE9trOPHBw-CI+iBFRyCKBtmBoXgDcKqCQsAgoGNi4yJzo3HzyIhJSsvIGlsqI4ADWYHAA7kgA3kHqVG0wUBAAFojs0nKKPYjdtrYQ6FTIenVGQvTIUCD0SADKFiwlZfyKmbMa84t6fp7eaxtbSDBUAHLuN4cwvMemiK-+9B8vshFNZEABaACMpzOiAuS108WiYF0QhmMNsMGAo3GyDgWK4n3KiAAvKTlvtmLpJuj0etNttEASgQA6KBwAAy7S8AGEFsUQaTiXoGCBkLpoTTEHSHogAISypnlCWzAC+U1sFGQwHQIEwUDu9KQrkwmGVarVWXA0Hgjxeby87DAQkqDURiS6U2lDNlT2e6Ge7BkpUWADFMHBcI7FCCAGQxxBPENMAbFMAnFQWiAIOiINyiABCkUwJPyWBweHYukIACUAKoAUV0kgRRfdVPSiAA9J3cwWi0I3SIVFmwDm838biW0GWipWAJwQgAcACYAMxNq727wnLs9vOFqID1tD6eFCu6Bcr9fNgCObWQACt6E1jAthGId93EHXnoQAJIALL1og9bVtWADy1ajKg8CYEUFDVHIVCTMO2ZQL2dBeKIhA1CWLhbq+4THsiiAAD6bv84qoaO6F5gBoiYfQohTgU5bFBeS5rhueaMdhNSfnuoj0bxQjXAE5GDmAKhAA
此外,如果您在谷歌上搜索了这个问题并且想知道如何获得T
from 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"