diff --git a/compiler/src/process_component_class.ts b/compiler/src/process_component_class.ts index 4d86de9..a0efe19 100644 --- a/compiler/src/process_component_class.ts +++ b/compiler/src/process_component_class.ts @@ -142,7 +142,7 @@ function processMembers(members: ts.NodeArray, parentComponentN newMembers.push(item); validateDecorators(item, log); } else { - addPropertyMember(item, newMembers, program, parentComponentName.getText()); + addPropertyMember(item, newMembers, program, parentComponentName.getText(), log); const result: UpdateResult = processMemberVariableDecorators(parentComponentName, item, ctorNode, watchMap, checkController, log, program, context, hasPreview, interfaceNode); if (result.isItemUpdate()) { @@ -203,7 +203,7 @@ function validateDecorators(item: ts.ClassElement, log: LogInfo[]): void { } function addPropertyMember(item: ts.ClassElement, newMembers: ts.ClassElement[], - program: ts.Program, parentComponentName: string): void { + program: ts.Program, parentComponentName: string, log: LogInfo[]): void { const propertyItem: ts.PropertyDeclaration = item as ts.PropertyDeclaration; let decoratorName: string; let updatePropertyItem: ts.PropertyDeclaration; @@ -219,13 +219,13 @@ function addPropertyMember(item: ts.ClassElement, newMembers: ts.ClassElement[], switch (decoratorName) { case COMPONENT_STATE_DECORATOR: case COMPONENT_PROVIDE_DECORATOR: - newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program) ? + newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program, log) ? OBSERVED_PROPERTY_SIMPLE : OBSERVED_PROPERTY_OBJECT, [type || ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)]); break; case COMPONENT_LINK_DECORATOR: case COMPONENT_CONSUME_DECORATOR: - newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program) ? + newType = ts.factory.createTypeReferenceNode(isSimpleType(type, program, log) ? SYNCHED_PROPERTY_SIMPLE_TWO_WAY : SYNCHED_PROPERTY_SIMPLE_ONE_WAY, [type || ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)]); break; diff --git a/compiler/src/process_component_member.ts b/compiler/src/process_component_member.ts index 8c92b17..95f1f6b 100644 --- a/compiler/src/process_component_member.ts +++ b/compiler/src/process_component_member.ts @@ -680,7 +680,7 @@ function isForbiddenUseStateType(typeNode: ts.TypeNode): boolean { return false; } -export function isSimpleType(typeNode: ts.TypeNode, program: ts.Program): boolean { +export function isSimpleType(typeNode: ts.TypeNode, program: ts.Program, log?: LogInfo[]): boolean { let checker: ts.TypeChecker; if (globalProgram.program) { checker = globalProgram.program.getTypeChecker(); @@ -694,9 +694,17 @@ export function isSimpleType(typeNode: ts.TypeNode, program: ts.Program): boolea return true; } else if (ts.isUnionTypeNode(typeNode) && typeNode.types) { const types: ts.NodeArray = typeNode.types; + let basicType: boolean = false; + let referenceType: boolean = false; for (let i = 0; i < types.length; i++) { const enumType: ts.SyntaxKind = getEnumType(types[i], checker); - if (!simpleTypes.has(enumType || types[i].kind) && !isEnumtype(typeNode)) { + if (simpleTypes.has(enumType || types[i].kind) || isEnumtype(typeNode)) { + basicType = true; + } else { + referenceType = true; + } + if (basicType && referenceType && log) { + validateVariableType(typeNode, log); return false; } } @@ -879,3 +887,11 @@ function validateWatchParam(type: LogType, pos: number, log: LogInfo[]): void { }); } +function validateVariableType(typeNode: ts.TypeNode, log: LogInfo[]): void { + log.push({ + type: LogType.ERROR, + message: 'The state variable type of a struct component cannot be declared by both a simple type and an object type.', + pos: typeNode.getStart() + }); +} +