typescript 的类型处理

111 天前
 yxcoder

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 类型
797 次点击
所在节点    TypeScript
8 条回复
lzgshsj
111 天前
const dosomething = <T extends keyof TypeProp>(data: T): TypeProp[T] => {
return data1[data];
}
Gaoti
111 天前
```typescript
function dosomething<K extends keyof TypeProp>(data: K): TypeProp[K] {
return data1[data];
}
```

善用泛型
yxcoder
111 天前
@Gaoti
@lzgshsj

请问一下,如果 dosomething 里面涉及到数组应该怎么处理的
yxcoder
111 天前
@yxcoder

譬如我希望
const dosomething = (data: keyof TypeProp | keyof TypeProp[]) => { ... }
yxcoder
111 天前
@yxcoder const dosomething = (data: keyof TypeProp | (keyof TypeProp)[]) => { ... }
MinonHeart
111 天前
可能类似这样吧,假设都返回对象形式
get(keys: keyof T): Pick<T, keyof T>;
get<U extends keyof T, K extends U[]>(keys: K): Pick<T, K[number]>;
Gaoti
111 天前
@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];
}
}
```
Track13
111 天前
类型体操里有这种。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1009990

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX