ESLint complains TypeScript type declaration uses type before it was declared
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I am creating a builder that has types, the way I declare the type is:
export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}
When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define)
. What is normal since I need to assert that each argument functions returns a builder of the same kind.
Which ways do I have to declare this without breaking the eslint rule?
Should I ignore the rule directly? Why?
javascript typescript eslint
add a comment |
I am creating a builder that has types, the way I declare the type is:
export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}
When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define)
. What is normal since I need to assert that each argument functions returns a builder of the same kind.
Which ways do I have to declare this without breaking the eslint rule?
Should I ignore the rule directly? Why?
javascript typescript eslint
add a comment |
I am creating a builder that has types, the way I declare the type is:
export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}
When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define)
. What is normal since I need to assert that each argument functions returns a builder of the same kind.
Which ways do I have to declare this without breaking the eslint rule?
Should I ignore the rule directly? Why?
javascript typescript eslint
I am creating a builder that has types, the way I declare the type is:
export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}
When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define)
. What is normal since I need to assert that each argument functions returns a builder of the same kind.
Which ways do I have to declare this without breaking the eslint rule?
Should I ignore the rule directly? Why?
javascript typescript eslint
javascript typescript eslint
asked Nov 16 '18 at 13:28
SirPeopleSirPeople
2,3621029
2,3621029
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.
The TypeScript team are pretty good at recursive types, so it's a valid type.
Disable the rule or create an exception so the tools let you get on with your job!
add a comment |
It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.
P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338851%2feslint-complains-typescript-type-declaration-uses-type-before-it-was-declared%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.
The TypeScript team are pretty good at recursive types, so it's a valid type.
Disable the rule or create an exception so the tools let you get on with your job!
add a comment |
ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.
The TypeScript team are pretty good at recursive types, so it's a valid type.
Disable the rule or create an exception so the tools let you get on with your job!
add a comment |
ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.
The TypeScript team are pretty good at recursive types, so it's a valid type.
Disable the rule or create an exception so the tools let you get on with your job!
ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.
The TypeScript team are pretty good at recursive types, so it's a valid type.
Disable the rule or create an exception so the tools let you get on with your job!
answered Nov 16 '18 at 13:41
FentonFenton
158k46295319
158k46295319
add a comment |
add a comment |
It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.
P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
add a comment |
It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.
P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
add a comment |
It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.
P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.
It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.
P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.
edited Nov 16 '18 at 13:39
answered Nov 16 '18 at 13:32
Nurbol AlpysbayevNurbol Alpysbayev
4,8341533
4,8341533
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
add a comment |
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.
– SirPeople
Nov 21 '18 at 8:15
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338851%2feslint-complains-typescript-type-declaration-uses-type-before-it-was-declared%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown