![](/img/trans.png)
[英]Typescript make the second parameter type depends on the first parameter type
[英]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。
如果我能获得有关如何使用打字稿正确实现这一点的更多见解,我将不胜感激。
您需要将fileType
和fileData
都传递给parseFileData
吗? 似乎fileType
等于fileData.fileType
。
通过直接打开fileData.fileType
,如果fileData.fileType
是'type1'
,编译器可以看到fileData
是TFileType1
。
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.