当前位置: 首页 > 知识库问答 >
问题:

javascript - TS 自动推导的问题?

赫连瀚
2024-06-03

hook 里我想根据是否存入 transformData 函数,自动推导出返回的 tableData 的类型,现在的问题是,当我传入 transformData 时,tableData 的类型是 (T | R)[] , 如果我不传 transformData, tableData 的类型是 (T|(R 的默认值))[] , 如何才能在传入transformDatatableData 得到 R[], 不传时, tableData 得到 T[] ?

import { GetListFn, PaginationProps, Query } from '@/types/globe'import { sleep } from 'radash'type SetMode = 'reset' | 'append'export default function useTable<    T extends Record<string, any> = Record<string, any>,    Q extends Record<string, any> | undefined = undefined,    R extends Record<string, any> = Record<string, any>>(config: {    request: (params: Query<Q>) => Promise<CommonResponse<{ records: T[], total: number }>>    search?: Q    getListOnMounted?: boolean    setMode?: SetMode    transformData?: (data: T[]) => R[]}) {    type InferItem<T, F> = F extends undefined ? T : R    const { request, search = {}, getListOnMounted = true, setMode = 'reset', transformData } = config    ...    const tableData = ref([]) as Ref<InferItem<T, typeof transformData>[]>    const getList = async (config?: { mode: SetMode }) => {        ...        try {            loading.value = true            const { ok, data } = await request(query)            await sleep(100)            if (ok) {                const responseData = data.data.records || []                if (responseData.length) {                    const maybeTransformData = transformData?.(responseData) ?? responseData                    tableData.value =                        _mode === 'reset' ? maybeTransformData : [...tableData.value, ...maybeTransformData]                } else if (_mode === 'reset') {                    tableData.value = []                }                pagination.total = data.data.total ?? 0                noMoreData.value = !responseData.length || tableData.value.length === pagination.total            }        } finally {            loading.value = false        }    }        ...    return {        ...        tableData,        ...    }}

这是我的使用方式

const { tableData } = useTable({    request: (params) => receptionist.list(Number(route.params.id), params),    search: { keyword: '' },    transformData: (data) => data.map((v) => ({ label: v.receptName, value: v.id }))})

求助各位大佬

共有1个答案

景国兴
2024-06-03
declare function f<T extends [] | [number]>(...args: T): T extends [] ? 1 : 2const a = f()  // 1const b = f(123)  // 2
 类似资料:
  • 定义一个枚举,将其中一个取值作为replace方法的第二个参数,这时候会报错,该怎么处理?

  • 在学习ts的类型的时候遇到这个问题,很是迷惑 这里我理解的是判断T是否同时继承类型X,Y,从而判断X,Y是否是同一类型?(这里不理解,假如T是"symbol|number|string",X是"string",Y是:"number",岂不是得出了X与Y相同?) 还有第二个extends看上去像是判断两个数值是否相等的意思?不能用===吗?有点看不懂ts里面的extends

  • C++是静态语言:所有变量的类型,都会在编译时被准确指定。所以,作为程序员你需要为每个变量指定对应的类型。 有些时候就需要使用一些繁琐类型定义,比如: std::map<std::string,std::unique_ptr<some_data>> m; std::map<std::string,std::unique_ptr<some_data>>::iterator iter=m.

  • 在微信公众号运营体系下,随着小程序的加入,使得微信生态更加全面和动态,小程序可以和服务号、订阅号互相搭配使用,打破公众号粉丝流量变现的瓶颈,通过一定内容(文本消息、图文消息、模版消息)的推送将公众号粉丝转化为品牌关注者、参与者以及最终成为购买者,提升转化。 诸葛io面向微信「公众号+小程序」运营人员推出了基于微信生态下的用户行为大数据运营自动化工具-自动推送,可以帮助企业的公众号、小程序运营和营销

  • 关于TS类型推导中结果中,函数参数的类型问题? 链接在这里:https://tsplay.dev/mxE51W 问题是: 为什么在action中,调用cx('a')的时候,参数类型是never呢? 如何让cx根据传入的泛型T来决定接受的类型呢?

  • 我正在学习自动模板演绎guid:https://en.cppreference.com/w/cpp/language/class_template_argument_deduction.因此我想试试这个。 我有以下嵌套类结构,其中是一个带有非模板参数的模板化类,内部结构只是有一个 我有< code > MyStruct mStruct作为会员: 我想像这样实现或构建My类 因此我给出了如上的演绎g