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

Nested Interface Does Not Type Check Function Returns Correctly #26170

Closed
calebeno opened this issue Aug 2, 2018 · 3 comments
Closed

Nested Interface Does Not Type Check Function Returns Correctly #26170

calebeno opened this issue Aug 2, 2018 · 3 comments
Labels
Duplicate An existing issue was already created

Comments

@calebeno
Copy link

calebeno commented Aug 2, 2018

TypeScript Version: ^3.1.0-dev.20180802

Search Terms:
Nested Interface
Interface Function
Deep Nested Interface
Deep Object Path

Code

Example 1:

interface TopLevel {
    aProperty: {
        aMethod(): {
            anotherMethod(): string
        }
    };
}

let mockUp: TopLevel = {
    aProperty: {
        aMethod: () => {
            return {
                anotherMethod: () => {
                    return 'string';
                },
                woops: () => {  // This should cause an error, not defined in the interface
                    return 0;
                }
            };
        },
        wrongAgain: () => {  // Causes error as expected
            return 0;
        }
    },
    shouldNotBeHere: 'string'  // This should cause an error, not defined in the interface
};

Example 2:

interface FirstLevel {
    aProperty: SecondLevel;
}

interface SecondLevel {
    aMethod(): ThirdLevel;
}

interface ThirdLevel {
    anotherMethod(): string;
}

let mockUpTwo: FirstLevel = {
    aProperty: {
        aMethod: (): ThirdLevel => {
            return {
                anotherMethod: () => {
                    return 'string';
                },
                woops: () => {  // Causes error as expected
                    return 0;
                }
            };
        },
        wrongAgain: () => {  // Causes error as expected
            return 0;
        }
    },
    shouldNotBeHere: 'string'  // This should cause an error, not defined in the interface
};

Expected behavior:
I was working on some complex nested interfaces with functions and realized that the ts compiler wasn't complaining in certain places when it should have been. These are two examples of the same typed object using a single nested interface and multiple nested interfaces.

Actual behavior:
You can see that there should be three expected errors in both examples but there is only one in the first and two in the second.

Repo
https://github.com/calebeno/ts-nested-interface-issue

Playground Link:
example 1 (shows NO errors):
https://www.typescriptlang.org/play/#src=interface%20TopLevel%20%7B%0D%0A%20%20%20%20aProperty%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20aMethod()%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20anotherMethod()%3A%20string%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0Alet%20mockUp%3A%20TopLevel%20%3D%20%7B%0D%0A%20%20%20%20aProperty%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20aMethod%3A%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anotherMethod%3A%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20'string'%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20woops%3A%20()%20%3D%3E%20%7B%20%20%2F%2F%20This%20should%20cause%20an%20error%2C%20not%20defined%20in%20the%20interface%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20wrongAgain%3A%20()%20%3D%3E%20%7B%20%20%2F%2F%20Causes%20error%20as%20expected%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%200%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%2C%0D%0A%20%20%20%20shouldNotBeHere%3A%20'string'%20%20%2F%2F%20This%20should%20cause%20an%20error%2C%20not%20defined%20in%20the%20interface%0D%0A%7D%3B%0D%0A

example 2 (shows NO errors):
https://www.typescriptlang.org/play/#src=interface%20FirstLevel%20%7B%0D%0A%20%20%20%20aProperty%3A%20SecondLevel%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20SecondLevel%20%7B%0D%0A%20%20%20%20aMethod()%3A%20ThirdLevel%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20ThirdLevel%20%7B%0D%0A%20%20%20%20anotherMethod()%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Alet%20mockUpTwo%3A%20FirstLevel%20%3D%20%7B%0D%0A%20%20%20%20aProperty%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20aMethod%3A%20()%3A%20ThirdLevel%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anotherMethod%3A%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20'string'%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20woops%3A%20()%20%3D%3E%20%7B%20%20%2F%2F%20Causes%20error%20as%20expected%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%200%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0D%0A%20%20%20%20%20%20%20%20%7D%2C%0D%0A%20%20%20%20%20%20%20%20wrongAgain%3A%20()%20%3D%3E%20%7B%20%20%2F%2F%20Causes%20error%20as%20expected%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%200%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%2C%0D%0A%20%20%20%20shouldNotBeHere%3A%20'string'%20%20%2F%2F%20This%20should%20cause%20an%20error%2C%20not%20defined%20in%20the%20interface%0D%0A%7D%3B%0D%0A

Related Issues:

@calebeno
Copy link
Author

calebeno commented Aug 2, 2018

I've seen this one popping up a lot #4742 but I'm not sure if this is the same thing or not as it doesn't contain generics.

@RyanCavanaugh
Copy link
Member

See #7547

@RyanCavanaugh RyanCavanaugh added the Duplicate An existing issue was already created label Aug 2, 2018
@typescript-bot
Copy link
Collaborator

This issue has been marked as a 'Duplicate' and has seen no recent activity. It has been automatically closed for house-keeping purposes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Duplicate An existing issue was already created
Projects
None yet
Development

No branches or pull requests

3 participants