1 、interface
interface TypeD{
subTypeA: string;
subTypeB: number;
}
interface TypeProp{
typeA: string;
typeB: number;
typeC: boolean;
typeD: TypeD;
}
2 、data
const data1: TypeProp = {
typeA: 'yes',
typeB: 1,
typeC: true,
typeD: {
subTypeA: 'no',
subTypeB: 0,
}
}
3 、function
const dosomething = (data: keyof TypeProp):[?] => {
return data1[data]
}
请问 [?] 处我需要怎么处理(或者我需要如何定义 dosomething),才能表示返回的是 data1[data]的类型
我想要的
const b = dosomething('typeB') // b 是 number 类型
const c = dosomething('typeC') // c 是 boolean 类型
const d = dosomething('typeD') // d 是 TypeD 类型
1
lzgshsj 307 天前
const dosomething = <T extends keyof TypeProp>(data: T): TypeProp[T] => {
return data1[data]; } |
2
Gaoti 307 天前
```typescript
function dosomething<K extends keyof TypeProp>(data: K): TypeProp[K] { return data1[data]; } ``` 善用泛型 |
4
yxcoder OP |
5
yxcoder OP @yxcoder const dosomething = (data: keyof TypeProp | (keyof TypeProp)[]) => { ... }
|
6
MinonHeart 307 天前
可能类似这样吧,假设都返回对象形式
get(keys: keyof T): Pick<T, keyof T>; get<U extends keyof T, K extends U[]>(keys: K): Pick<T, K[number]>; |
7
Gaoti 307 天前
@yxcoder #5
``` typescript function dosomething<K extends keyof TypeProp>(data: K): TypeProp[K]; function dosomething<K extends keyof TypeProp>( data: K[], ): { [P in K]: TypeProp[P] }[]; function dosomething<K extends keyof TypeProp>( data: K | K[], ): TypeProp[K] | TypeProp[K][] { if (Array.isArray(data)) { return data.map((key) => data1[key]); } else { return data1[data]; } } ``` |
8
Track13 306 天前 via Android
类型体操里有这种。
|