gpt4 book ai didi

javascript - typescript 打字封装

转载 作者:行者123 更新时间:2023-12-01 15:24:39 25 4
gpt4 key购买 nike

在下面的例子中,我试图描述一个复杂的 typescript 类型,我想稍后使用 FinalType .问题是,由于它的复杂性,这种类型需要声明污染页面 IntermediaryType 的中间类型。/IntermediaryType2 .

Playground

type IntermediaryType = {
decisiveKey: true,
mutatedKey: (params: any) => void,
} | {
decisiveKey: false,
mutatedKey?: false,
}

interface IntermediaryType2 {
foo?: string,
bar?: boolean,
}

type FinalType = IntermediaryType & IntermediaryType2;

const Foo = (param: FinalType) => {}

Foo({
decisiveKey: true,
mutatedKey: () => {},
});

我的问题是,有没有办法使中间类型无法访问,并且只允许使用 FinalType ?

我已经看到您可以使用 封装部分代码。括号 喜欢 :
{
type IntermediaryType = {
decisiveKey: true,
mutatedKey: (params: any) => void,
} | {
decisiveKey: false,
mutatedKey?: false,
}

interface IntermediaryType2 {
foo?: string,
bar?: boolean,
}

type FinalType = IntermediaryType & IntermediaryType2;
}

const Foo = (param: FinalType) => {}

Foo({
decisiveKey: true,
mutatedKey: () => {},
});

但是我显然无法访问 FinalType .我尝试使用 returnexport但没有一个有效。

理想的情况是:
type FinalType = {
type IntermediaryType = {
decisiveKey: true,
mutatedKey: (params: any) => void,
} | {
decisiveKey: false,
mutatedKey?: false,
}

interface IntermediaryType2 {
foo?: string,
bar?: boolean,
}

return IntermediaryType & IntermediaryType2;
}

const Foo = (param: FinalType) => {}

Foo({
decisiveKey: true,
mutatedKey: () => {},
});

有什么线索吗?



使用@Aluan Haddad 的答案,目前我能做到的最好的是:
namespace _ {
type IntermediaryType = {
decisiveKey: true,
mutatedKey: (params: any) => void,
} | {
decisiveKey: false,
mutatedKey?: false,
}

interface IntermediaryType2 {
foo?: string,
bar?: boolean,
}

export type FinalType = IntermediaryType & IntermediaryType2;
}; type FinalType = _.FinalType;

const Foo = (param: FinalType) => {}

Foo({
decisiveKey: true,
mutatedKey: () => {},
});

我很想在上面添加一些语法糖!

最佳答案

你真正想要做的,为类型引入任意范围,可以通过 TypeScript 命名空间来完成。

declare namespace myNamespace {
type IntermediaryType = {
decisiveKey: true,
mutatedKey: (params: any) => void,
} | {
decisiveKey: false,
mutatedKey?: false,
}

interface IntermediaryType2 {
foo?: string,
bar?: boolean,
}

export type FinalType = IntermediaryType & IntermediaryType2;
}

const Foo = (param: myNamespace.FinalType) => {}

Foo({
decisiveKey: true,
mutatedKey: () => {},
});

但是,如果您正在编写现代代码并因此使用模块,则几乎总是应避免使用命名空间。幸运的是,如果您使用的是模块,则解决方案会更加简单;不要导出中间类型。
type IntermediaryType = {
decisiveKey: true,
mutatedKey: (params: any) => void,
} | {
decisiveKey: false,
mutatedKey?: false,
}

interface IntermediaryType2 {
foo?: string,
bar?: boolean,
}

export type FinalType = IntermediaryType & IntermediaryType2;

export const Foo = (param: FinalType) => {}

Foo({
decisiveKey: true,
mutatedKey: () => {},
});

关于javascript - typescript 打字封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62282570/

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