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

typescript - 如何约束函数的入参间的关系?

魏航
2024-08-21
type ITrack<T extends Record<any, (...args: any[]) => void>> = (trackName: keyof T, ...args: Parameters<T[keyof T]>) => void;

interface ITrackMethods {
  trackA: (data: { a: string }, options: { force?: boolean }) => void;
  trackB: (data: { b: number }) => void;
}

export const track: ITrack<ITrackMethods> = (trackName, trackData) => {
  if (trackName === 'trackA') {
    // 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackA']>[0]
    console.log(trackData.a);
  } else if (trackName === 'trackB') {
    // 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackB']>[0]
    console.log(trackData.b)
  }
};

希望能够实现一个工具类型 ITrack,入参之间存在类型约束,可自动推导出类型。
但是上方实现由多处报错。
image.png

共有2个答案

汪建白
2024-08-21
interface ITrackMethods {
    trackA: (data: { a: string }, options: { force?: boolean }) => void;
    trackB: (data: { b: number }) => void;
}

type ITrackParams<T> = {
    [K in keyof T]: T[K] extends (...args: any) => void ? [key: K, ...args: Parameters<T[K]>] : never
}[keyof T]

const track = ([trackName, trackData]: ITrackParams<ITrackMethods>) => {
    if (trackName === 'trackA') {
        // string
        console.log(trackData.a);
    } else if (trackName === 'trackB') {
        // number
        console.log(trackData.b)
    }
};
阎昌勋
2024-08-21

合在一起才好收窄类型

type Magic<T, K = keyof T> = K extends keyof T ? T[K] extends (...args: any[]) => void ? {
  trackName: K;
  trackData: Parameters<T[K]>[0];
} : never : never

export const track = ({ trackData, trackName }: Magic<ITrackMethods>) => {
  if (trackName === 'trackA') {
    // 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackA']>[0]
    console.log(trackData.a);
  } else if (trackName === 'trackB') {
    // 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackB']>[0]
    console.log(trackData.b)
  }
};
 类似资料:
  • 本文向大家介绍TypeScript 类型参数作为约束,包括了TypeScript 类型参数作为约束的使用技巧和注意事项,需要的朋友参考一下 示例 使用TypeScript 1.8,类型参数约束可以从同一类型参数列表中引用类型参数。以前这是一个错误。            

  • 我有一系列复杂的类型级别函数,它们的计算结果如下: 显然,在这种情况下,这个表达式是一个。更一般地说,我们可以说: 有没有办法教GHC推断这一点? 编辑:@chi指出,在某些情况下,GADT可以解决这一问题,但我的特殊情况是: 然后 不能被访问,但是也许GHC应该能够推断出

  • 所以我试图写一个函数,它有一个泛型,它扩展了一个特定的对象,从而约束了它。接下来,我想将这个泛型与参数的定义一起使用,以生成一个新的“增强”参数。这一切都很好,但一旦我想引入一个默认值的参数TypeScript抱怨如下消息(这在操场上的一些不同的变化): 功能: 错误: 类型“{foo:string;}”不可分配给类型“T” 编译器警告我,我可能想使用foo,实际上我做到了。是简单地不可能以这种方

  • 假设我有一个类模板,

  • 此模式抛出TypeScript错误: 类型为“(string | number)[]”的参数不能分配给类型为“string[]| number[]”的参数 我理解这是因为TypeScript编译器会将其视为字符串和数字混合的数组。 是否有一种类型安全的方法来实现这一点?我只能想投给任何感觉不好的[]:

  • 我有一个Oracle表,它有10列-col1、col2、COL3...COL10。我的要求是-对于col1、col2、col3的唯一值集,即(col1、col2、col3)只允许col4的唯一值,即使它是多次。例如:如果有10行COL1=3,COL2='A005',COL3=10,则所有10行的col4值应相同。 我如何在Oracle中放置此限制?