typescript 从类型交集推断泛型

ioekq8ef  于 2023-06-07  发布在  TypeScript
关注(0)|答案(2)|浏览(166)

我试图用typescript推断类型交集的泛型,但不确定为什么编译器不能正确推断位置参数。例如:

type Brand<T, Y> = T & { __brand: Y}

type Foo = Brand<number, 'Hello'>

type ExtractT<T> = T extends Brand<infer A, unknown> ? A : never

function test(a: ExtractT<Foo>) {

}

test(1)  <-- error

我希望ExtractT可以从Brand<number,>定义中提取number
有什么方法可以从Brand中提取number类型吗?
Playground链接:https://www.typescriptlang.org/play?#code/C4TwDgpgBAQgTgQwHYBMA8AVANFAmgPigF4oMoAyKAbygH1aAjRVALjwF8BYAKB9EigAxAPbDisZuiQBXALYMIcHAHIAEhAA2G4cvw8+4aAFEAHsEQBjYBkyESZCGYioAzhOToAlkgBmiqACCONJIANZIwgDuSIQA-IFQbEgQAG6K+tw+IVaewkhQwBAuwAAUCGym5ghWNiLC+ACU1BlcvNyFxSUAjA1AA

ui7jx7zq

ui7jx7zq1#

我也面临着同样的问题。从这条注解(从类型交集推断泛型)中,我意识到我们所需要的就是将类型保存在某个地方,以便typescript可以找到它,并在以后使用推断输出它。它仍然不是很方便,但至少它对我来说工作得很好:)

type Brand<T, Y> = T & { __brand: Y, __T?: T }
// you dont even need to set the __T from the javascript side
// you can leave it undefined or uninitialized

type Foo = Brand<number, 'Hello'>

type ExtractT<T> = T extends Brand<infer A, unknown> ? A : never;

function test(a: ExtractT<Foo>) {

}

test(3)

以下是我的问题以及我如何解决它的示例:https://tsplay.dev/w29YjW

mwkjh3gx

mwkjh3gx2#

如果你确定__brand不会与任何其他对象冲突,你可以尝试...

type ExtractT<T> = T extends { __brand: unknown } ? Omit<T, '__brand'> : never;
var x: ExtractT<Foo> = 1; // works

相关问题