Hur returnerar man gränssnittets nyckeltyper i TypeScript?
Jag har interface
interface Some {
key1: string
key2: number
}
Det finns en funktion.
const fn = (key: keyof Some) => {
return <Some>someObject[key]
}
Kan jag få returtypen via strängnyckel?
fn(‘key1’) // can ts know that it will return `string`?
fn(‘key2’) // can ts know that it will return `number`?
UPPDATERAD :
Tack @captain-yossarian för svaret! Nu har jag ett lite utökat fall.
export const getConfig = <T extends EntityInitialConfig, K extends keyof T> (key?: K) => {
let config: T = window.someObject
return key ? config[key] : config
}
getConfig('clientKey') // ts shows `string | EntityInitialConfig`
Och det är ett problem eftersom det bara behöver string. Hur gör man det?
Svar #1
Jag antar att du letar efter nästa lösning:
const fn = <T extends unknown, K extends keyof T>(obj: T, key: K): T[K] => {
return obj[key]
}
const result = fn({ name: 'John', age: 42 }, 'name') // string
const result2 = fn({ name: 'John', age: 42 }, 'age') // number
[UPPDATERING] Din funktion förväntar sig att nyckelargumentet ska vara odefinierat, du bör definitivt ange standardvärde.
Om du är okej med standardvärdet, då bör du lägga till funktionsöverlagringar.
interface EntityInitialConfig {
age: number;
name: string;
}
const config: EntityInitialConfig = { age: 42, name: 'John' };
interface GetConfig {
(key: undefined): EntityInitialConfig['name'] // it is kinda default value
<K extends keyof EntityInitialConfig>(key: K): EntityInitialConfig[K]
}
export const getConfig: GetConfig = <K extends keyof EntityInitialConfig>(key?: K) => {
return key ? config[key] : config
}
const x = getConfig('age') // ts shows number
P.S. Jag är inte säker på om det är korrekt syntax: return <Some>someObject[key]
