Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Partial seems not to be supported #138

Open
Loksly opened this issue Mar 29, 2021 · 3 comments
Open

Partial seems not to be supported #138

Loksly opened this issue Mar 29, 2021 · 3 comments

Comments

@Loksly
Copy link

Loksly commented Mar 29, 2021

Hi everyone!

I recently realized I cannot use Partial. For example this works:

src/services/index.ts

import { Path, POST } from "typescript-rest";
import { Response } from "typescript-rest-swagger";

export interface Complex {
    fieldC: string;
    fieldD: number;
}

export interface MyBodyDefinition {
    fieldA: string;
    fieldB: Complex;
}

@Path("/api/v1/example")
export class ExampleService {

    @Response<MyBodyDefinition>(200, "Configuration")
    @Path("update")
    @POST
    async update( body: MyBodyDefinition ): Promise<MyBodyDefinition> {
      return Promise.resolve(body);
    }  
}

But if you change MyBodyDefinition to:

export interface MyBodyDefinition {
    fieldA: string;
    fieldB: Partial<Complex>;
}

then the output is:

There was a problem resolving type of 'PartialComplex'.
There was a problem resolving type of 'MyBodyDefinition'.
/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:267
        throw err;
        ^

TypeError: Cannot read property 'filter' of undefined
    at getModelTypeProperties (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:463:47)
    at getModelTypeProperties (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:459:15)
    at getReferenceType (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:250:26)
    at resolveType (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:80:25)
    at /tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:452:23
    at Array.map (<anonymous>)
    at getModelTypeProperties (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:418:14)
    at getReferenceType (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:250:26)
    at resolveType (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:91:25)
    at Object.resolveType (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/resolveType.js:60:16)
    at MethodGenerator.generate (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/methodGenerator.js:46:34)
    at /tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/controllerGenerator.js:87:58
    at Array.map (<anonymous>)
    at ControllerGenerator.buildMethodsForClass (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/controllerGenerator.js:87:14)
    at ControllerGenerator.buildMethods (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/controllerGenerator.js:69:43)
    at ControllerGenerator.generate (/tmp/failure/node_modules/typescript-rest-swagger/dist/metadata/controllerGenerator.js:48:27)

For the record, the rest of the files have this content:

package.json:

{
  "name": "failure",
  "version": "0.0.1",
  "scripts": {
    "build": "npm run clean && npm run tsc && npm run swagger && npm run swaggerIsOk",
    "clean": "npx rimraf dist .nyc_output",
    "tsc": "./node_modules/typescript/bin/tsc",
    "swagger": "npx swaggerGen -c ./swagger.config.yml",
    "swaggerIsOk": "grep -q '/api/v1' ./dist/swagger.json"
  },
  "dependencies": {
  },
  "devDependencies": {
    "typescript": "^4.2.3",
    "typescript-rest": "^3.0.2",
    "typescript-rest-swagger": "^1.1.6"
  }
}

swagger.config.yml:

swagger:
  outputDirectory: ./dist
  entryFile: 
    - ./src/services/*
  outputFormat: OpenApi_3
  name: Mock server example
  description: This is a test
  license: Unlicensed
  produces: [application/json]
  securityDefinitions:
    default:
      type: http
      scheme: bearer
      name: Authorization
      

tsconfig.json

{
  "compilerOptions": {
    "alwaysStrict": true,
    "declaration": true,
    "emitDecoratorMetadata": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "module": "commonjs",
    "newLine": "LF",
    "noFallthroughCasesInSwitch": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "outDir": "./dist/",
    "removeComments": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "strict": true,
    "strictBindCallApply": true,
    "strictFunctionTypes": true,
    "strictNullChecks": true,
    "strictPropertyInitialization": true,
    "target": "es6"
  },
  "include": ["./src/**/*.ts"],
  "exclude": ["node_modules"]
}

Thanks for your help.

@Avrmaster
Copy link

It seems like none of the build-in types are supported.
Same issue for union types (it's even worse - a client fallback to "{}")

@aperona-hai
Copy link

Generics and Record type also give and error

@viniciusln
Copy link

Same issue here using the Pick type.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants