【发布时间】:2021-08-05 04:05:35
【问题描述】:
动机
我想使用对象作为函数参数。这允许调用者使用指定的字段名称清楚地定义参数,从而更容易进行审查。
问题
但是,如果您使用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;
}
}
Gripe:我不喜欢这个实现,因为 src/implementations/ComposedServiceImplementation 不需要从 import 到 src/domain/ServiceInterface,因为它只实现了 ComposedServiceInterface
2。使用Parameter 实用程序类型
参考:https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype
我似乎无法让 typescript 同意使用 Class 方法,例如Parameter<ComposedServiceInterface.doesThings>
有人可以提供任何建议吗?
【问题讨论】:
标签: typescript