Note: I converted my expressjs code to be an ES6 module. The compiler hasn't complained yet and I'm surprised. I assume we can do this without having to use an .mjs file extension or put type module in a package.json inside my server folder?
I'm using
Node 14.4.0
typescript: 3.9.7
Anyway back to my problem. Not sure how you have to type expressJS stuff, for example I get No overload matches this call here:
I mean if it's saying there is no such callback why are people using code this way? I'm pretty sure this was valid code for app.listen to check errors like this in the past
server/server.ts
import cluster from 'cluster';
import os from 'os';
import App from './api.js';
const port = process.env.PORT || 3000;
if (cluster.isMaster) {
for (let i = 0; i < os.cpus().length; i++) {
cluster.fork();
}
console.log('Ready on port %d', port);
} else {
App.listen(port, (err) => {
console.log(`express is listening on port ${port}`);
if (err) {
console.log('server startup error');
console.log(err);
}
});
}
server/api.ts
import historyApi from 'connect-history-api-fallback';
import compression from 'compression';
import countryTable from './data/countries.json';
import express from 'express';
import companyTable from './data/companies.json';
import _ from 'lodash';
const App = express()
.use(compression())
.on('error', (err: any) => {
console.log(err);
})
.get('/api/v1/countries', (_req: any, res: any) => {
res.json(countryTable.map((country: any) => _.pick(country, ['id', 'name', 'images'])));
})
.get('/api/v1/companies', (_req: any, res: any) => {
res.json(
companyTable.map((company: any) =>
_.pick(company, [
'id',
'active',
'images',
'locations',
])
)
);
})
.use(historyApi())
.use(express.static('dist'))
.use((_req: any, res: any) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET,OPTIONS');
res.header(
'Access-Control-Allow-Headers',
'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json'
);
res.send('Sorry, Page Not Found');
});
export default App;
server/tsconfig.json
{
"extends": "../../tsconfig",
"compilerOptions": {
"outDir": "../../dist/server", /* Redirect output structure to the directory. */
"rootDir": "." /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
},
"include": ["./*.ts"],
"resolveJsonModule": true
}
./tsconfig.json
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
"target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
"lib": ["es5", "es6", "dom"], /* Specify library files to be included in the compilation. */
"moduleResolution": "node",
"allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
"jsx": "react",
"noImplicitAny": true,
"sourceMap": false, /* Generates corresponding '.map' file. */
"rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
"removeComments": true, /* Do not emit comments to output. */
"strict": true, /* Enable all strict type-checking options. */
"noUnusedLocals": true, /* Report errors on unused locals. */
"noUnusedParameters": true, /* Report errors on unused parameters. */
// "rootDirs": ["."], /* List of root folders whose combined content represents the structure of the project at runtime. */
"typeRoots": [
"node_modules/@types"
], /* List of folders to include type definitions from. */
"esModuleInterop": true,
"allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
"resolveJsonModule": true,
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true
},
"include": [
"src"
],
"exclude": [
"/node_modules",
"/src/server",
"/src/client/js/ink-config.js",
"**/test",
"dist"
]
}
