繁体   English   中英

如何为第二个参数类型取决于第一个参数值的函数定义 typecipt 类型

[英]How to define typescipt types for functions where second parameter type depends on first parameter value

我实现了一段代码,它读取多个文件并将数据转换为另一种形式。

这是打字稿游乐场的一个例子

我有一些类型定义如下

type TFileTypes = 'type1' | 'type2'

type TFileContentType = TFileType1 | TFileType2

type TFileType1 = {
    name: string
    val1: string
}

type TFileType2 = {
    name: string
    val2: string
}

type TFile1Transform = {
    val1t: string,
    val2t: string
}

type TFile2Transform = {
    val11t: string
    val22t: string
}

type TProjectData = {
    'type1'?: TFile1Transform,
    'type2'?: TFile2Transform
}

我有一些使用这些类型的功能如下

const fileData = [
    {
        fileType: 'type1',
        content: {
            name: 'fname',
            val1: 'val1'
        }

    },
    {
        fileType: 'type2',
        content: {
            name: 'fname2',
            val2: 'val2'
        }

    }
]

const loadFileData = () => {
    const projectData: TProjectData = {}

    for (const data of fileData) {
        const fileType = data.fileType

        const resultData = parseFileData(fileType, data.content)

        projectData[fileType] = resultData
    }

    return projectData

}

const transformFile1Data = (fileData: TFileType1): TFile1Transform => {
    return {
        val1t: fileData.name,
        val2t: fileData.val1
    }
}

const transformFile2Data = (fileData: TFileType2): TFile2Transform => {
    return {
        val11t: fileData.name,
        val22t: fileData.val2
    }
}

const parseFileData = (fileType: TFileTypes, fileData: TFileContentType) => {
    switch(fileType) {
        case 'type1': {
            return transformFile1Data(fileData)
        }
        case 'type2': {
            return transformFile2Data(fileData)
        }
    }
}

我不确定如何在 parseFileData 中使用类型系统,因为它在transformFile1Data(fileData)transformFile2Data(fileData)显示错误,因为 parseFileData 接受TFileDataType并且它取决于 fileType。

如果我能获得有关如何使用打字稿正确实现这一点的更多见解,我将不胜感激。

您需要将fileTypefileData都传递给parseFileData吗? 似乎fileType等于fileData.fileType

通过直接打开fileData.fileType ,如果fileData.fileType'type1' ,编译器可以看到fileDataTFileType1

const parseFileData = (fileData: TFileDataType) => {
    switch(fileData.fileType) {
        case 'type1': {
            return transformFile1Data(fileData)
        }
        case 'type2': {
            return transformFile2Data(fileData)
        }
    }
}

请注意,您需要明确地给fileData一个类型来测试它。

const fileData: TFileDataType[] = ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM