演示: https://tsplay.dev/NB6axN
代码:
const action = { '/posts': () => Promise.resolve(['a']), '/test': () => Promise.resolve([1]),} as const;type test = ReturnType<ActionType['/test']>;async function getData<T extends ItemKey>(url: T) { return await action[url]();}type ActionType = typeof action;type ItemKey = keyof typeof action;const post = getData('/posts'); // Promise<string[]>const test = getData('/test'); // Promise<number[]>
结果:
'/posts'
拿到 Promise<string[]>
'/test'
拿到 Promise<number[]>
前置条件:
尝试了一下
const action = { '/posts': () => Promise.resolve(['a']), '/test': () => Promise.resolve([1]),} as const;type test = ReturnType<ActionType['/test']>;type ActionType = typeof action;type ItemKey = keyof typeof action;type DePromise<T> = T extends Promise<infer R> ? R : T;type InferResult<T extends ItemKey> = DePromise<ReturnType<ActionType[T]>>;async function getData<T extends ItemKey>(url: T): Promise<InferResult<T>> { return await action[url]() as InferResult<T>;}const post = getData('/posts'); // Promise<string[]>const test = getData('/test'); // Promise<number[]>
传送门:http://u5a.cn/qcTA9
尝试的时候遇到些问题:
Promise<?>
,没办法,只好先 DePromise
之后再把 Promise
加上。await action[url]()
自动推导出来的类型是 number[] | string[]
,所以只好用 as InferResult<T>
强制声明类型。为方法本身提供返回值类型不就可以了吗。
const action = { '/posts': (): Promise<string[]> => Promise.resolve(['a']),}const post = action['/posts']();
function getData<T extends ItemKey>(url: T) { return action[url]() as ReturnType<ActionType[T]>}
在TypeScript中,< code>class关键字引入了值和类型: 有没有一种方法可以使函数返回既是类型又是值的东西? 问这个问题的另一种方法是:有没有办法在下面声明的类型,以便类型检查? 看到这个打字游戏了吗
问题内容: 我需要兑现承诺,以便可以通过封闭函数将其返回。我知道,由于正常的JavaScript范围,我可能无法按照编码的方式进行操作。有什么办法可以做到吗? 位于#1 的 console.log 会生成正确的数据。 console.log #2总是产生’a’; 任何指针将不胜感激。 问题答案: 许诺背后的基本原则之一是它是异步处理的。这意味着您无法创建承诺,然后立即在代码中同步使用其结果(例如,
typescript,函数如何根据传入的key,返回对象对应的这些key?比如: 现在这个写法肯定不对,变量attr的推断是unknown,如何写函数getAttr的返回定义,才能让变量attr的推断为{age:number, name:string },就是函数传入了哪些key,就只返回这些key的推断
TS演示:https://tsplay.dev/mLO04N , 问题:当我将reduce中返回对象的children注释去掉,返回的类型就变成any了,请问正确姿势应该是? 我把提取的值像这样复制给一个对象,获取的类型是对的,但是如果把这个对象作为返回数据类型就不对了 请不要试图类似用下面断言的方式来解决,我试图通过正确的姿势获取数据类型:
#1处的console.log生成正确的数据。console.log#2始终生成“a”; 如有任何指示,将不胜感激。
如何使用TS根据传入的property得到对应的数据呢?比如JS中常常会根据动态的属性获取结果,如下: 在TS中,可以这样做: 我需要明确根据提供的property获取类型,该怎么做呢?