Code Monkey home page Code Monkey logo

Comments (6)

yortus avatar yortus commented on July 18, 2024

Hi @UnknownHero,

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

from asyncawait.

UnknownHero avatar UnknownHero commented on July 18, 2024

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'.    

from asyncawait.

yortus avatar yortus commented on July 18, 2024

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.

from asyncawait.

UnknownHero avatar UnknownHero commented on July 18, 2024

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.

from asyncawait.

yortus avatar yortus commented on July 18, 2024

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.

from asyncawait.

UnknownHero avatar UnknownHero commented on July 18, 2024

Thank you so much !

from asyncawait.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.