Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1e12806

Browse files
authored
feat(valid-v-model): add support for type assertions and non-null expressions (#2393)
1 parent 4ea3dfc commit 1e12806

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

‎lib/rules/valid-v-model.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ function isOptionalChainingMemberExpression(node) {
4949
* @returns {boolean} `true` if the node can be LHS.
5050
*/
5151
function isLhs(node) {
52+
if (node.type === 'TSAsExpression' || node.type === 'TSNonNullExpression') {
53+
return isLhs(node.expression)
54+
}
55+
5256
return node.type === 'Identifier' || node.type === 'MemberExpression'
5357
}
5458

‎tests/lib/rules/valid-v-model.js

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,51 @@ tester.run('valid-v-model', rule, {
143143
{
144144
filename: 'comment-value.vue',
145145
code: '<template><MyComponent v-model="/**/" /></template>'
146+
},
147+
{
148+
filename: 'test.vue',
149+
code: '<template><MyComponent v-model="a as string"></MyComponent></template>',
150+
languageOptions: {
151+
parserOptions: {
152+
parser: require.resolve('@typescript-eslint/parser')
153+
}
154+
}
155+
},
156+
{
157+
filename: 'test.vue',
158+
code: '<template><MyComponent v-model="a!"></MyComponent></template>',
159+
languageOptions: {
160+
parserOptions: {
161+
parser: require.resolve('@typescript-eslint/parser')
162+
}
163+
}
164+
},
165+
{
166+
filename: 'test.vue',
167+
code: '<template><MyComponent v-model="a as unknown as string"></MyComponent></template>',
168+
languageOptions: {
169+
parserOptions: {
170+
parser: require.resolve('@typescript-eslint/parser')
171+
}
172+
}
173+
},
174+
{
175+
filename: 'test.vue',
176+
code: '<template><MyComponent v-model="a!!!!"></MyComponent></template>',
177+
languageOptions: {
178+
parserOptions: {
179+
parser: require.resolve('@typescript-eslint/parser')
180+
}
181+
}
182+
},
183+
{
184+
filename: 'test.vue',
185+
code: '<template><MyComponent v-model="(((a!) as unknown)! as string)!"></MyComponent></template>',
186+
languageOptions: {
187+
parserOptions: {
188+
parser: require.resolve('@typescript-eslint/parser')
189+
}
190+
}
146191
}
147192
],
148193
invalid: [
@@ -241,6 +286,66 @@ tester.run('valid-v-model', rule, {
241286
filename: 'test.vue',
242287
code: '<template><input v-model="(a?.b).c.d"></template>',
243288
errors: ["'v-model' directive has potential null object property access."]
289+
},
290+
{
291+
filename: 'test.vue',
292+
code: '<template><MyComponent v-model="a() as string"></MyComponent></template>',
293+
errors: [
294+
"'v-model' directives require the attribute value which is valid as LHS."
295+
],
296+
languageOptions: {
297+
parserOptions: {
298+
parser: require.resolve('@typescript-eslint/parser')
299+
}
300+
}
301+
},
302+
{
303+
filename: 'test.vue',
304+
code: '<template><MyComponent v-model="a()!"></MyComponent></template>',
305+
errors: [
306+
"'v-model' directives require the attribute value which is valid as LHS."
307+
],
308+
languageOptions: {
309+
parserOptions: {
310+
parser: require.resolve('@typescript-eslint/parser')
311+
}
312+
}
313+
},
314+
{
315+
filename: 'test.vue',
316+
code: '<template><MyComponent v-model="a() as unknown as string"></MyComponent></template>',
317+
errors: [
318+
"'v-model' directives require the attribute value which is valid as LHS."
319+
],
320+
languageOptions: {
321+
parserOptions: {
322+
parser: require.resolve('@typescript-eslint/parser')
323+
}
324+
}
325+
},
326+
{
327+
filename: 'test.vue',
328+
code: '<template><MyComponent v-model="a()!!!!"></MyComponent></template>',
329+
errors: [
330+
"'v-model' directives require the attribute value which is valid as LHS."
331+
],
332+
languageOptions: {
333+
parserOptions: {
334+
parser: require.resolve('@typescript-eslint/parser')
335+
}
336+
}
337+
},
338+
{
339+
filename: 'test.vue',
340+
code: '<template><MyComponent v-model="(((a()!) as unknown)! as string)!"></MyComponent></template>',
341+
errors: [
342+
"'v-model' directives require the attribute value which is valid as LHS."
343+
],
344+
languageOptions: {
345+
parserOptions: {
346+
parser: require.resolve('@typescript-eslint/parser')
347+
}
348+
}
244349
}
245350
]
246351
})

‎typings/eslint-plugin-vue/util-types/ast/ts-ast.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as ES from './es-ast'
66
import { TSESTree } from '@typescript-eslint/types'
77
export type TSNode =
88
| TSAsExpression
9+
| TSNonNullExpression
910
| TSTypeParameterInstantiation
1011
| TSPropertySignature
1112
| TSMethodSignatureBase
@@ -20,6 +21,11 @@ export interface TSAsExpression extends HasParentNode {
2021
typeAnnotation: any
2122
}
2223

24+
export interface TSNonNullExpression extends HasParentNode {
25+
type: 'TSNonNullExpression'
26+
expression: ES.Expression
27+
}
28+
2329
export interface TSTypeParameterInstantiation extends HasParentNode {
2430
type: 'TSTypeParameterInstantiation'
2531
params: TypeNode[]

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /