gpt4 book ai didi

typescript :如何避免重复对象声明作为参数?

转载 作者:行者123 更新时间:2023-12-04 17:16:19 25 4
gpt4 key购买 nike

动机

我想使用对象作为函数参数。这允许调用者使用指定的字段名称清楚地定义参数,从而使审查更容易。

问题

但是,如果您使用 implements,这不是很好处理和 extends .这就是我现在正在做的。

src/domain/ServiceInterface.ts

export interface ServiceInterface {
doesThings(args: {
awesomeFieldName: string;
isThisAwesomeFieldName?: string;
ohWaitMoreAwesomeFieldName?: string;
}): boolean;

src/domain/ComposedServiceInterface.ts

import { ServiceInterface } from "./domain/ServiceInterface";
export type ComposedServiceInterface = ServiceInterface & { hello: () => string };

src/implementations/ComposedServiceImplementation.ts

import { ComposedServiceInterface } from "./domain/ComposedServiceInterface";
export class ComposedServiceImplementation implements ComposedServiceInterface {
doesThings(args: {
awesomeFieldName: string;
isThisAwesomeFieldName?: string;
ohWaitMoreAwesomeFieldName?: string;
}): boolean {
return true;
}
}

尝试

1。使用 type/interface对于对象参数

src/domain/ServiceInterface.ts

export type DoesThingsParameter = {
awesomeFieldName: string;
isThisAwesomeFieldName?: string;
ohWaitMoreAwesomeFieldName?: string;
};
export interface ServiceInterface {
doesThings(args: DoesThingsParameter): boolean;

src/domain/ComposedServiceInterface.ts

import { ServiceInterface } from "./domain/ServiceInterface";
export type ComposedServiceInterface = ServiceInterface & { hello: () => string };

src/implementations/ComposedServiceImplementation

import { ComposedServiceInterface } from "./domain/ComposedServiceInterface";
import { DoesThingsParameter } from "./domain/ServiceInterface";
export class ComposedServiceImplementation implements ComposedServiceInterface {
doesThings(args: DoesThingsParameter): boolean {
return true;
}
}

提示:我不喜欢这个实现,因为 src/implementations/ComposedServiceImplementation不需要 import来自 src/domain/ServiceInterface因为它只实现了 ComposedServiceInterface

2。使用 Parameter实用程序类型

引用:https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype

我似乎无法让 typescript 同意使用类方法,例如Parameter<ComposedServiceInterface.doesThings>

有人可以提供任何建议吗?

最佳答案

重用类型/接口(interface)的正确方法是 Attemp#1。每当你需要重用一些类型定义时,你可以将其提取出来。如果您担心从 src/implementations/ComposedServiceImplementation 中的 src/domain/ServiceInterface 导入,您始终可以为类型创建一个通用文件并在其中添加通用类型,然后导入两个文件。

这里要注意的一点是,您仅从 src/domain/ServiceInterface 导入类型,因此在编译 TS 代码后将清除此导入。如果你想知道你是否正在导入一个值的类型,你可以像这样使用 type only import:从“./domain/ServiceInterface”导入类型 {DoesThingsParameter};这将使您的代码更具可读性。

关于 Attemp#2,尽量避免过于频繁地使用复杂的实用程序类型,如 ParameterConstructorParameter,因为它们的实现非常复杂,Typescript 必须做很多工作.这些类型通常用于获取您无权直接访问的参数的类型。例如,如果您使用的库不提供 typescript 定义,并且您想要使用该库中的函数。

// some-library.ts
export function configure({
config1 = 'somevalue',
retries = 1
}) {
...code
}

现在您想使用此configure 函数,但想在外部创建一个配置对象。

// helper.ts
import { configure } from 'some-lib';

const configuration = {
config1: 'overrideValue',
unknownProperty: 'unknownValue'
}
function helper() {
const lib = configure(configuration)
...some work here
}

现在,配置具有 configure 函数所需的所有属性,但它添加了一个 configure args 中不存在的新属性。在这种情况下,您必须使用 ParameterType 来获取 configure args 的类型定义。

关于 typescript :如何避免重复对象声明作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68660493/

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