gpt4 book ai didi

typescript - 如何使幻像类型与 TypeScript 中的方法一起使用?

转载 作者:行者123 更新时间:2023-12-05 03:34:24 24 4
gpt4 key购买 nike

考虑以下使用虚类型的程序:

const strlen = (str: string) => str.length;

type Const<A, B> = { type: 'Const', value: A };

const Const = <A, B = never>(value: A): Const<A, B> => ({ type: 'Const', value });

const map = <A, B, C>(_f: (value: B) => C, { value }: Const<A, B>): Const<A, C> => Const(value);

const contramap = <A, B, C>(_f: (value: C) => B, { value }: Const<A, B>): Const<A, C> => Const(value);

const constant = Const(true);

map(strlen, constant); // works

contramap(strlen, constant); // works

Playground

上面的程序类型检查是因为推断出了正确的类型。 constant值具有推断类型 Const<boolean, never> . map使用 A = boolean 类型调用函数, B = string , 和 C = number . contramap使用 A = boolean 类型调用函数, B = number , 和 C = string .

但是,最好使用方法而不是函数来编写上述表达式。因此,我尝试了以下方法:

const strlen = (str: string) => str.length;

interface Const<A, B> {
map: <C>(f: (value: B) => C) => Const<A, C>;
contramap: <C>(f: (value: C) => B) => Const<A, C>;
}

const Const = <A, B = never>(value: A): Const<A, B> => ({
map: () => Const(value),
contramap: () => Const(value)
});

const constant = Const(true);

constant.map(strlen); // works

constant.contramap(strlen); // error

Playground

如您所见,map方法有效,但 contramap方法没有。这是因为 constant 的类型是Const<boolean, never>并且它没有通过方法调用进行细化,即 map类型未细化为 Const<boolean, string>contramap类型未细化为 Const<boolean, number> .

因此,mapcontramap工作但不是两者兼而有之。如果对象的类型是Const<boolean, never>然后contramap不起作用。如果对象的类型是Const<boolean, unknown>然后map不起作用。

我怎样才能同时制作 mapcontramap使用方法而不是函数工作?

最佳答案

我通过将 Const 接口(interface)的类型参数 B 设为虚类型来解决这个问题。

const strlen = (str: string) => str.length;

interface Const<A, B> {
map: <B, C>(f: (value: B) => C) => Const<A, C>;
contramap: <B, C>(f: (value: C) => B) => Const<A, C>;
}

const Const = <A, B = never>(value: A): Const<A, B> => ({
map: () => Const(value),
contramap: () => Const(value)
});

const constant = Const(true);

constant.map(strlen); // works

constant.contramap(strlen); // works

Playground

Const 接口(interface)的类型参数 B 现在被 mapcontramap 。这是有道理的,因为 Const 接口(interface)的类型参数 B 是幻像类型。因此,不应使用它。另一方面,mapcontramap 的调用者应该能够决定类型参数 B 应该被实例化的类型。

关于typescript - 如何使幻像类型与 TypeScript 中的方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70153058/

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