首页 > 解决方案 > 从任何方式“推断”类方法参数

问题描述

我有一个类,它有两种方法,如下所示:

export class ResolverType {
    prompt = () => ({
        type: 'list',
        name: 'resolverType',
        message: 'Choose a resolver type:',
        choices: [
            'query',
            'mutation'
        ]
    })
    partials = (plop) => {
        plop.setPartial('resolverType', '{{ resolverType }}')
    }
}

这是一种称为 a 的常见类的一部分PlopPrompt

每个PlopPrompt都有相同的形状。它们看起来像这样:

import { NodePlopAPI, PlopGenerator } from 'plop';

abstract class PlopPrompt {
    abstract prompt(): PlopGenerator['prompts'][number]
    abstract partials(plop: NodePlopAPI): void
}

或者

interface PlopPrompt {
    prompt(): PlopGenerator['prompts'][number]
    partials(plop: NodePlopAPI): void
}

或切换到static并使用@PlopPrompt装饰器。

interface PlopPromptInterface {
    prompt(): any
    partials(plop: NodePlopAPI): void
}

export function PlopPrompt() {
    return <U extends PlopPromptInterface>(constructor: U) => { constructor };
}

我正在寻找一种方法:

  1. 确保 aPlotPrompt有这两种方法。
  2. 是否partials可以自动输入参数?它已经在定义中定义,我不明白为什么我看不到打字并且plop参数返回为any.

不太明白为什么plop在这里输入:

interface Contract {
    prompt(): any
    partials(plop: NodePlopAPI): void
}

const example: Contract = {
    prompt: () => ({
        type: 'list',
        name: 'resolverType',
        message: 'Choose a resolver type:',
        choices: [
            'query',
            'mutation'
        ]
    }),
    partials: (plop) => {
        plop.setGenerator()
        plop.setPartial('resolverType', '{{ resolverType }}')
    }
}

但这里没有输入:

interface Contract {
    prompt(): any
    partials(plop: NodePlopAPI): void
}

class Example extends Contract {
    prompt = () => ({
        type: 'list',
        name: 'resolverType',
        message: 'Choose a resolver type:',
        choices: [
            'query',
            'mutation'
        ]
    })
    partials = (plop) => {
        plop.setGenerator()
        plop.setPartial('resolverType', '{{ resolverType }}')
    }
}

有没有办法纠正这个问题?我在这里找到了很长的对话,但没有答案。`


也试过这个,使用匿名类。参数,仍然没有输入。

const ResolverType: PlopPrompt = class {
    static prompt = () => ({
        type: 'list',
        name: 'resolverType',
        message: 'Choose a resolver type:',
        choices: [
            'query',
            'mutation'
        ]
    })
    static partials = (plop) => {
        plop.setPartial('resolverType', '{{ resolverType }}')
    }
}

标签: typescript

解决方案


这是满足上述要求的唯一方法,但ResolverType不再是一个类。

我想了解我可以让这成为一堂课。

import { NodePlopAPI } from 'plop';
import { PlopPrompt } from '../shared/PlopPrompt';

interface PlopPrompt {
    prompt(): any
    partials(plop: NodePlopAPI): void
}

export const ResolverType: PlopPrompt = {
    prompt: () => ({
        type: 'list',
        name: 'resolverType',
        message: 'Choose a resolver type:',
        choices: [
            'query',
            'mutation'
        ]
    }),
    partials(plop) {
        plop.setPartial('resolverType', '{{ resolverType }}')
    }
}

推荐阅读