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

Examples on TypeScript #13

Closed
UnknownHero opened this issue Feb 25, 2015 · 6 comments
Closed

Examples on TypeScript #13

UnknownHero opened this issue Feb 25, 2015 · 6 comments

Comments

@UnknownHero
Copy link

Hello!
Can you provide examples written on TypeScript ?
I try do it, but get "types" errors when compile code.

Thanks

@yortus
Copy link
Owner

yortus commented Feb 25, 2015

Hi @UnknownHero,

Have you got a code snippet showing the problem you are having?

@UnknownHero
Copy link
Author

I get your basic example - https://github.com/yortus/asyncawait#basic-example
Remove lodash using.
And rewrite using bluebird

//references to node and asyncawait .d.ts

import Promise = require('bluebird');
import fs = require('fs');
import path = require('path');
import async = require('asyncawait/async');
import await = require('asyncawait/await');

var fsPromise = Promise.promisifyAll(fs);

// Return the number of files in the given directory
var countFiles = async (function(dir) {
    var files = await (fsPromise.readdirSync(dir));
    return 1;
});

countFiles(__dirname)
    .then (function (num) { console.log('There are ' + num + ' files in ' + __dirname); })
    .catch(function (err) { console.log('Something went wrong: ' + err); });

pachage.json

{
  "name": "",
  "version": "0.0.1",
  "dependencies": {
        "asyncawait" : "0.7.4",
        "bluebird" : "*", 
  }
}

Compile command:

 tsc src/app.ts  --sourceMap  --outDir  build/ --module commonjs   

Compiler version: 1.4.1.0
Output:

src/app.ts(13,34): error TS2339: Property 'readdirSync' does not exist on type 'Object'.    

@yortus
Copy link
Owner

yortus commented Feb 25, 2015

The problem is with this line:

var fsPromise = Promise.promisifyAll(fs);

The promisifyAll() function adds a bunch of properties to the object passed to it, so TypeScript cannot statically determine what the resulting object will look like. So in bluebird.d.ts the author decided to make it return just Object, rather that the same type as the argument (in this case fs). Therefore, fsPromise has the type Object, which doesn't have a method called readdirSync. It may have been better if they typed the return value as any, to prevent exactly the problem you are having.

You can override the typing easily though, just replace the line with:

var fsPromise: any = Promise.promisifyAll(fs);

and you should be good to go.

@UnknownHero
Copy link
Author

Thank you.
Also, i change declaration
https://github.com/yortus/asyncawait/blob/master/src/typings/bluebird/bluebird.d.ts#L416

static promisifyAll(target: Object): Object;

to:

static promisifyAll<T>(target: T): T;

and my code compile .
But IDE show me error anyway.

Can write something like that ? :

var fsPromise: fs = Promise.promisifyAll(fs);

or

var fsPromise: typeof fs = Promise.promisifyAll(fs);

I want autocomplete for Intellij Idea or Visual Studio.

@yortus
Copy link
Owner

yortus commented Feb 26, 2015

I suspect you mean to use the readdirAsync function added by promisifyAll(), not the readdirSync that comes directly from the fs module. The -Sync version is blocking so you dont need await for that one.

That's why I suggested typing fsPromise as any. TypeScript cannot work out at compile time what the shape of promisifyAll's return value will be at run time. So unfortunately, you won't be able to get intellisense for the -Async functions added by promisifyAll(), which are the ones you want to use.

Alternatively, you can promisify just the functions you want, like so:

var readdirAsync = Promise.promisify(fs.readdir);

in which case readdirAsync will have type Function.

In general, the 'shape' of the return values of functions like promisify and promisifyAll are polymorphic and depend on the runtime shape of their arguments. TypeScript has no runtime insight, so it can't work out these types, hence the fallback to more general static types like Object and Function.

@UnknownHero
Copy link
Author

Thank you so much !

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

2 participants