gpt4 book ai didi

typescript - Typescript 不应该选择最具体的函数实现吗?

转载 作者:行者123 更新时间:2023-12-04 14:48:15 25 4
gpt4 key购买 nike

我有以下代码:


type allPossibileTypes = 'my-first-type' | 'my-second-type' | 'my-third-type';
type genericFunction = (innerVariable: any) => void;

class A {
doSomethingWith(inputType: 'my-first-type', callback: (innerVariable: string) => void);
doSomethingWith(inputType: allPossibileTypes, callback: genericFunction);
doSomethingWith(inputType: string, callback: any) {
// function logic here
}
}

如果我尝试这样调用函数:

AInstance.doSomething('my-first-type', ...);

我希望 typescript 会提示我使用 (innerVariable: string) => void 作为第二个参数,但相反,它提示我使用 genericFunction 类型。直到现在,我都认为在选择类型提示时,TypeScript 会选择它可以使用的最具体的实现,我错了吗?

如果是,我如何实现定义一个函数,它允许我将特定字符串用作第一个参数,并且在某些具体情况下,基于第一个参数,给我额外的类型提示?

最佳答案

您需要从重载的 allPossibileTypes 中排除 'my-first-type':

type allPossibileTypes = 'my-first-type' | 'my-second-type' | 'my-third-type';
type genericFunction = (innerVariable: any) => void;

class A {
doSomethingWith(inputType: 'my-first-type', callback: (innerVariable: string) => void): void
doSomethingWith(inputType: Exclude<allPossibileTypes, 'my-first-type'>, callback: genericFunction): void
doSomethingWith(inputType: string, callback: any) {
// function logic here
}
}

new A().doSomethingWith('my-first-type', (a: string) => void 0); // ok
new A().doSomethingWith('my-first-type', (a: number) => void 0) // error


Playground

如果没有 Exclude,则带有 numberstring 的两个版本都是有效的

附言

interface test { prop1: string, prop2: string };

type ToBool<T> = {
[Prop in keyof T]: boolean
}

type Result = ToBool<test>

关于typescript - Typescript 不应该选择最具体的函数实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69551970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com